একটি স্ট্রিং সন্ধান করুন এবং একটি ব্যাপ্তির মধ্যে এবং পরে সমস্ত কিছু মুদ্রণ করুন


9

আমার এই ফাইলটি রয়েছে:

sometext1{
string1
}

sometext2{
string2
string3
}

sometext3{
string4
string5
string6
}

আমি একটি নির্দিষ্ট স্ট্রিংয়ের জন্য এই ফাইলটি অনুসন্ধান করতে চাই {এবং খোলার আগে পর্যন্ত এই স্ট্রিংয়ের আগে এবং স্ট্রিংয়ের পরে সবকিছু শেষ হয়ে যাওয়া পর্যন্ত মুদ্রণ করতে চাই }। আমি সেড দিয়ে এটি অর্জনের চেষ্টা করেছি তবে আমি যদি পরিসরের মধ্যে সমস্ত কিছু /{/,/string2/উদাহরণস্বরূপ সেড প্রিন্ট করার চেষ্টা করি তবে :

sometext1{
string1
}

sometext2{
string2
sometext3{
string4
string5
string6
}

আমি যদি স্ট্রিং "স্ট্রিং 2" সন্ধান করি তবে আমার আউটপুটটি হওয়া দরকার:

sometext2{
string2
string3
}

ধন্যবাদ।


ঠিক আছে, এখন আমি খুঁজে পেয়েছি যে এগুলিকে পরে মুছে ফেলার জন্য আমার আউটপুটটির লাইন নম্বরগুলি দরকার। আমি কমান্ডটি পরিবর্তনের চেষ্টা করেছিলাম যে @ মাইক্রোভার কোনও ভাগ্যই সরবরাহ করেনি, আমি সেডের হোল্ড ফাংশন নিয়ে কিছুটা বিভ্রান্ত হয়েছি।
রডরিগো

ভাল, গীজ, রডরিগো, আপনি নিজের কথা কাউকে বলতে পারেন নি। এটি করা যেতে পারে তবে এটি ভাল মতো করা হয় grep -n '' <infile | sed ...sedকমান্ড পরিবর্তন করতে হবে; বিশেষত /ঠিকানা /বিটস যা ^শীর্ষ-লাইনের অ্যাঙ্করগুলির সন্ধান করে। সুতরাং, যদি আপনি আমার উত্তর ব্যবহার করা হয়েছে আপনি সম্ভবত পারে: grep -n '' | sed 'H;/{$/h;/^[^:]*:}/x;/{\n.*PATTERN/!d'। সমস্ত আউটপুট লাইনগুলি মূল ফাইলের লাইন সংখ্যাগুলির সাথে উপস্থাপিত হবে যার পরে একটি কোলন 1:sometext1{\n2:string1এবং এর মতো আরও থাকবে। sedএটির আগে যা ফিল্টার হবে কেবল সেগুলিই ফিল্টার করবে কেবলমাত্র প্রতিটি আউটপুট লাইন একটি সংখ্যা দিয়ে খোলে।
মাইকজার্ভ

উত্তর:


9

এখানে দুটি কমান্ড দেওয়া হয়েছে। আপনি যদি এমন একটি আদেশ চান যা শেষ .*{$পংক্তির সিক্যুয়েন্সে ট্রিম করে (@ ডন_ক্রিসটি যেমন করে ed) আপনি এটি করতে পারেন:

sed 'H;/{$/h;/^}/x;/{\n.*PATTERN/!d'

... যা ইলাইন চরিত্রটি Hঅনুসরণ করে প্রতিটি লাইন পুরানো \nজায়গাতে সংযোজন করে , hমেলে প্রতিটি লাইনের জন্য পুরানো স্থানটি ওভাররাইট করে {$এবং মেলে প্রতিটি লাইনের জন্য hপুরানো এবং প্যাটার্ন স্পেসগুলি অদলবদল করে ^}- এবং এর মাধ্যমে এটি বাফার ফ্লাশ করে।

এটি কেবলমাত্র লাইনগুলি মুদ্রণ করে যা কোনও {তারপরে একটি \nইললাইন এবং তারপরে PATTERNকোনও মুহুর্তে মেলে - এবং এটি কেবল কখনও বাফার অদলবদলের সাথে সাথেই ঘটে।

এটি ধারাবাহিকতায় {$শেষের ম্যাচগুলির যে কোনও লাইনকে এলিড করে , তবে আপনি এইগুলি সহ সমস্তগুলি পেতে পারেন:

sed '/PATTERN.*\n/p;//g;/{$/,/^}/H;//x;D'

এটি যা করে তা hপ্রতিটি ...{$.*^}.*সিকোয়েন্সের জন্য অদলবদল এবং পুরানো ফাঁকা স্থানগুলি , Hএকটি \newline চরিত্র অনুসরণ করে পুরানো স্থানের অনুক্রমের মধ্যে সমস্ত লাইন যুক্ত করে , এবং প্রতিটি লাইনের চক্রের জন্য প্যাটার্ন স্পেসে Dপ্রথমটি ঘটে যাওয়া \nইওলাইন চরিত্র পর্যন্ত একাদশটি যা থাকে তা দিয়ে আবার শুরু করার আগে।

অবশ্যই, \nপ্যাটার্ন স্পেসে এটি কখনই ইলাইন হয়ে যায় যখন কোনও ইনপুট লাইন মেলে ^}- আপনার পরিসীমাটির শেষ - এবং যখন এটি অন্য কোনও উপলক্ষে স্ক্রিপ্টটি পুনরায় চালু করে তখন এটি যথারীতি পরবর্তী ইনপুট লাইনে টান দেয়।

যখন PATTERNকোনও ই- \nলাইন হিসাবে একই প্যাটার্ন স্পেসে পাওয়া যায় , যদিও এটি ^}আবার এটির ওভাররাইট করার আগে প্রচুর মুদ্রণ করে (যাতে এটি পরিসীমাটি শেষ করে বাফারটিকে ফ্লাশ করতে পারে)

এই ইনপুট ফাইলটি দেওয়া হয়েছে (ধন্যবাদ ডন) :

sometext1{
string1
}

sometext2{
PATTERN
string3
}

sometext3{
string4
string5
string6
}

Header{
sometext4{
some string

string unknown

here's PATTERN and PATTERN again
and PATTERN too
another string here
}
}

প্রথম মুদ্রণ:

sometext2{
PATTERN
string3
}
sometext4{
some string

string unknown

here's PATTERN and PATTERN again
and PATTERN too
another string here
}

... এবং দ্বিতীয় ...

sometext2{
PATTERN
string3
}
Header{
sometext4{
some string

string unknown

here's PATTERN and PATTERN again
and PATTERN too
another string here
}

@ ডন_ক্রিস্তেটি - আমি জানি না। এটি কেবল একটি রেখার সাথে শুরু করে ক্রমটি সীমিত করে }। এটির মতো উপকারী হতে পারে ... open{\nsub;\n{ command; }\n}; close- তবে আমি নিশ্চিত নই যে এখানে কী চলছে ...
মাইকসার্ভ

হাই @ মিমকিজার - আমার অনুরূপ প্রশ্নটি এখানে উত্থাপিত হয়েছে ইউনিক্স.স্ট্যাকেক্সেঞ্জার.কম / সেকশনস / 232509/… , আপনার সমাধানটি ছোট ফাইলটিতে কাজ করে, তবে আমার কাছে একটি বড় ফাইল রয়েছে এবং আমি "হোল্ড স্পেস ওভারফ্লোড" পেয়ে যাচ্ছি। ভুল বার্তা. কোনও সুযোগ কি আপনি জানেন, আমি কীভাবে এটি সমাধান করতে পারি? অনেক ধন্যবাদ
নারায়ণ আখাদে

@ নারায়ণআখাদে - না। যাইহোক, কোনও ওভারহল ছাড়াই নয়। যদি না ... বড় আকারের ইনপুট থাকে যা {...}ব্লকগুলিতে থাকে না? যদি এটি হয় এবং আপনি প্রথম সমাধানটি ব্যবহার করছেন তবে আপনি ন্যায়বিচারের /{$/,/^}/Hপরিবর্তে শুরুতে করতে পারেন H। তবে আপনি যদি দ্বিতীয় সমাধানটিও চেষ্টা করে থাকেন এবং এখনও একই ত্রুটির মুখোমুখি হন তবে এটির সাহায্যের সম্ভাবনা নেই কারণ এটি ইতিমধ্যে এটি করে। এবং ছাড় না ed। এখানে ডোন একটি খুব ভাল উত্তর পেয়েছে , এবং খুব সহজভাবে পাশাপাশি edঅস্থায়ী বাফার ফাইল ব্যবহার করতে প্রয়োগ করা যেতে পারে , যা মেম বাফারকে ছাড়িয়ে নেওয়া উচিত।
মাইকজার্ভ

6

এর সাথে এখানে একটি সমাধান রয়েছে ed:

ed -s filename <<< $'g/PATTERN/?{?,/}/p\nq\n'

এটাই:

g/PATTERN/     # mark each line matching PATTERN  
?{?,/}/p       # for each marked line, print all lines from the previous { up to the next }  
q              # quit editor

এটি ধরে নিয়েছে PATTERNযে প্রতিটি জোড়ার মধ্যে একটি মাত্র লাইন রয়েছে { }অন্যথায় আপনি PATTERNএকই ব্লকের ভিতরে প্রতিটি অতিরিক্ত লাইনের জন্য সদৃশ আউটপুট পাবেন ।
এটি { }একক লাইন মিলে PATTERNযেমন একাধিক জন্য কাজ করবে যেমন PATTERNদুটি ভিন্ন বিভাগে একটি পরীক্ষার ফাইলের জন্য :

sometext1{
string1
}

sometext2{
PATTERN
string3
}

sometext3{
string4
string5
string6
}

Header{
sometext4{
some string

string unknown

here's PATTERN again

another string here
}
}

চলমান

ed -s sample <<< $'g/PATTERN/?{?,/}/p\nq\n'

আউটপুট:

sometext2{
PATTERN
string3
}
sometext4{
some string

string unknown

here's PATTERN again

another string here
}

আমি এ থেকে অনেক কিছু নিয়েছি, আসলে! অনেক ধন্যবাদ!
মাইকজার্ভ

আমি জানি না যে এই আদেশটি বিদ্যমান। ধন্যবাদ
রডরিগো


0
$ awk 'BEGIN{RS="\n\n"; FS="[{}]"} {if ($2 ~ /string4/) {print $2}}' t1.txt
string4
string5
string6

কোথায়:

  • string4 -> স্ট্রিংটি মিলবে
  • t1.txt -> কোয়েরিতে উল্লিখিত ফাইল সামগ্রী রয়েছে

-2

সেড-এন '/ স্ট্রিং / পি' ফাইলের নাম

-n যখন সেডের সাথে যুক্ত হয়ে সেডের ডিফল্ট আচরণটি যুক্ত করা হয় তখন এই বিবৃতিটি আপনাকে যা চায় ঠিক তা দিতে পারে না তবে এটি কেবল স্ট্রিংটিকে স্থানচ্যুত করতে হবে

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