সেড ব্যবহার করে দুটি ডাবল কোটের মধ্যে সাবস্ট্রিং পান


14

আমার একটা ফাইল আছে

xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)

এখন আমি কেবল ফাইলের পাথগুলিই বের করতে এবং এটি অন্য একটি ফাইলে সংরক্ষণ করতে চাই। আউটপুট ফাইলটি হ'ল:

/home/path/to/file 
/home/path/to/file1 
/home/path/to/file2
/home/path/to/file3

সেড বা অ্যাড ব্যবহার করে আমি কীভাবে এটি করতে পারি?

আমি চেষ্টা করেছি sed -n '/"/,/"/p' myfileকিন্তু কাজ করছে না।


3
ভোটদানগুলি বন্ধ করার জন্য - এটি কীভাবে সম্ভবত অফ-টপিক হতে পারে? এটি শেল প্রোগ্রামিং সম্পর্কে !! এটাই সেই প্রোগ্রাম যা স্ট্যাক ওভারফ্লোর জন্য শীর্ষস্থানীয়!
জোনাথন লেফলার

2
স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। আপনি দেখতে পাচ্ছেন, আমাদের মাঝে মাঝে চুলকানি ট্রিগার আঙ্গুলগুলি বন্ধ হওয়ার খারাপ কারণে পুরোপুরি ভাল প্রশ্ন (যেমন এটি হিসাবে) বন্ধ করে দেওয়া নিয়ে সমস্যা হয়। এটি প্রায়শই ঘটে না (বা, আমি সময় মতো সমস্যাটি প্রায়শই দেখতে পাই না), তবে তা ঘটে। খুব বেশিদিন আগে এফএকিউ পড়তে ভুলবেন না ।
জোনাথন লেফলার

উত্তর:


17

আপনি আপনার আরএসসিএন কমান্ডের স্টাডারকে একটি অজানা স্ক্রিপ্টে পাইপ করতে পারেন:

awk -F '"' '{print $2}' 

অথবা এই মত একটি কাটা কমান্ড:

cut -d'"' -f2

2
বা, সংক্ষিপ্ত:cut -d\" -f2

@ অ্যান্ডারস জোহানসন: ধন্যবাদ আমি উত্তর দেওয়ার জন্য আপনার কাট কমান্ডটিও যুক্ত করেছি।
অনুভা

আমি মনে করি এটি কাজ করছে না .. আপনি দেখতে পাচ্ছেন যে ফাইলের ক্ষেত্রের নম্বরটি $ 2 বা f2 স্থির নয় .. ধন্যবাদ!

আসলে rsync সর্বদা stdr এর মাঝে "এবং প্রথমে ফাইলপথ লিখবে "
অনুভা

1
@ জাম ৮৮: অনুভব যেভাবে লিখেছেন তাতে এটি কাজ করবে। ক্ষেত্রের ডিলিমিটারটি দ্বিগুণ উদ্ধৃতিতে সেট করা আছে। তার মানে প্রথম ডাবল উদ্ধৃতি (সম্ভবত একটি খালি স্ট্রিং) পর্যন্ত সমস্ত কিছু $1; প্রথম এবং দ্বিতীয় ডাবল উদ্ধৃতিগুলির মধ্যে সমস্ত কিছু $2; এবং দ্বিতীয় ডাবল উদ্ধৃতিটির পরে সমস্ত কিছু $3( $4, ...) এ রয়েছে। ফাইলের নাম সর্বদা প্রথম দুটি ডাবল কোটের মধ্যে থাকে, সুতরাং এই সমাধানটি কাজ করা উচিত (এবং আমি এটি পরীক্ষার সময় করলাম)।
জোনাথন লেফলার

6

ব্যবহার sed:

sed 's/^[^"]*"\([^"]*\)".*/\1/'

এটি সন্ধান করে: লাইনের শুরু, অ-উদ্ধৃতিগুলির একটি সিরিজ, একটি ডাবল উদ্ধৃতি, লাইনটিতে অ-উদ্ধৃতিগুলির একটি সিরিজ, একটি ডাবল উদ্ধৃতি এবং অন্য যে কোনও কিছুর ক্যাপচার করে এবং এটি ক্যাপচারিত উপাদান দ্বারা প্রতিস্থাপন করে।

$ sed 's/^[^"]*"\([^"]*\)".*/\1/' <<'EOF'
> xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
> "/home/path/to/file1": Permission denied (13) rsync:
> "/home/path/to/file2": Permission denied (13) rsync:
> "/home/path/to/file3": Permission denied (13)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$

গনুহ সঙ্গে RHEL 5 লিনাক্স টেস্ট sed, কিন্তু শুধুমাত্র বৈশিষ্ট্য 7 সংস্করণ ইউনিক্স ™ সংস্করণে কাজ করে ব্যবহার sed

ঘটনাচক্রে, এটি করার একটি সামান্য সরল উপায় দুটি বিকল্প কমান্ড সহ; খালি স্ট্রিংয়ে প্রথম ডাবল উদ্ধৃতি সহ সমস্ত কিছু পরিবর্তন করুন (এটি শূন্যের ক্রম বা ডাবল উদ্ধৃতি অনুসারে আরও নন কোট); এখন প্রথম ডাবল কোট যা কিছু নেই তার সবকিছু পরিবর্তন করুন:

sed 's/^[^"]*"//; s/".*//'

ঘটনাচক্রে, আপনি যে কমান্ডটি চেষ্টা করেছিলেন (`সেড-এন '/" /, / "/ পি') ডাবল উদ্ধৃতি সম্বলিত একটি লাইন থেকে ডাবল উদ্ধৃতি সম্বলিত পরবর্তী লাইনে প্রিন্ট করে, বিন্দুগুলিতে কোনও সম্পাদনা ছাড়াই। কোন কারণেই এটি আপনার পক্ষে কাজ করে বলে মনে হয় নি - এটি আপনি যা চেয়েছিলেন তা করেছিল, তবে আপনি যা করতে বলেছিলেন তা করার জন্য আপনি যা চান বলেছিলেন তা নয়।

দক্ষতা অনুসারে, পারফরম্যান্সে একটি পরিমাপযোগ্য পার্থক্য হওয়ার সম্ভাবনা নেই। রক্ষণাবেক্ষণের স্বাচ্ছন্দ্যের দিক থেকে আমার সন্দেহ হয় যে মস্তিষ্কের কোষগুলির উপরেরগুলি কম ট্যাক্স করছে।


1

যদি আপনার সংস্করণ grepপার্ল-রেজিপ্স্প সমর্থন করে:

grep -oP '(?<=")/home/.*?(?=")' file >> anotherfile

ফলাফল:

/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3

আপনি ইচ্ছা করলে ডাবলসের মধ্যে যে কোনও কিছুর সাথে মিল রাখতে আপনি এটিও কম কঠোর করতে পারেন:

grep -oP '(?<=")[^"]*' file >> anotherfile

পরের লাইনে অতিরিক্ত ডাবল উদ্ধৃতি থাকলেই কি আপনাকে .*অ-লোভী করা দরকার .*?? বা [^"]*জায়গায় ব্যবহার করবেন .*?
জোনাথন লেফলার

-1

কোনও ফাইলে যে কোনও আউটপুট সংরক্ষণ করতে >> অপারেটরটি ব্যবহার করুন।

মত

grep -r "pattern" * >> file.txt

সুতরাং কেবল আপনার নির্দিষ্ট দৃশ্যের জন্য অ্যাডিংয়ের মাধ্যমে সেড ব্যবহার করে এটি পরিবর্তন করুন

>> filename

কমান্ড


grep -rআর্গুমেন্টে তালিকাভুক্ত কোনও ডিরেক্টরি ( *) দ্বারা একটি পুনরাবৃত্ত অনুসন্ধান করতে পারে । আপনার কোন প্যাটার্নটি মনে আছে তা পরিষ্কার নয় grepতবে পুরো লাইনটি বেছে নেবে। মহড়ার উদ্দেশ্য হ'ল একটি লাইনের অংশ থেকে তথ্য সংগ্রহ করা। আপনি যদি জিএনইউ ব্যবহার করে থাকেন grepতবে তা করার উপায় রয়েছে ( -o); এগুলি মানহীন (জিএনইউ একটি ডি-স্ট্যাক্টো স্ট্যান্ডার্ড নির্ধারণের পরিমাণ বাদে)। একইভাবে পিসিআরই নিয়মিত প্রকাশের ব্যবহারের সাথে; এগুলি হ'ল অন্য জিএনইউ এক্সটেনশন। আপনার যদি জিএনইউ থাকে grepএবং grepডিফল্টরূপে জিএনইউ উপলব্ধ না হয় এমন প্ল্যাটফর্মগুলিতে কাজ করার কোনও পরিকল্পনা নেই তবে তারা ঠিক আছে ।
জোনাথন লেফলার

দুঃখিত আমি এটি মিস করেছি, আমি ভেবেছিলাম যে তিনি একটি ফাইলে আউটপুট রাখার জন্য সাধারণভাবে জানতে চান, এবং গ্রেপ তার একটি উদাহরণ মাত্র।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.