দুটি মার্কার নিদর্শনগুলির মধ্যে লাইনগুলি কীভাবে নির্বাচন করতে হয় যা একাধিকবার ডাব্লু / এসডের সাথে সংঘটিত হতে পারে


119

ব্যবহার awkবা sedআমি দুটি পৃথক চিহ্নিতকারী নিদর্শনগুলির মধ্যে সংঘটিত লাইনগুলি কীভাবে নির্বাচন করতে পারি? এই নিদর্শনগুলির সাথে চিহ্নিত একাধিক বিভাগ থাকতে পারে।

উদাহরণস্বরূপ: ধরুন ফাইলটিতে রয়েছে:

abc
def1
ghi1
jkl1
mno
abc
def2
ghi2
jkl2
mno
pqr
stu

আর প্রারম্ভিক প্যাটার্নটি abcএবং শেষের প্যাটার্নটি হ'ল mno , আমার আউটপুটটি এইভাবে দরকার

def1
ghi1
jkl1
def2
ghi2
jkl2

আমি একবার ব্যবহার করে প্যাটার্নটি মেলে:

sed -e '1,/abc/d' -e '/mno/,$d' <FILE>

ফাইলের শেষ হওয়া পর্যন্ত বারবার এটি করার sedবা awkকরার কোনও উপায় আছে কি ?

উত্তর:


188

awkপ্রয়োজনে মুদ্রণটি ট্রিগার করতে একটি পতাকা সহ ব্যবহার করুন :

$ awk '/abc/{flag=1;next}/mno/{flag=0}flag' file
def1
ghi1
jkl1
def2
ghi2
jkl2

কিভাবে কাজ করে?

  • /abc/এই পাঠ্যযুক্ত রেখাগুলির সাথে মিল রয়েছে /mno/
  • /abc/{flag=1;next}flagপাঠ্য abcপাওয়া গেলে সেট করে তারপরে, এটি লাইনটি এড়িয়ে যায়।
  • /mno/{flag=0}পাঠ্যটি পাওয়া flagগেলে আনসেট করে mno
  • ফাইনালটি flagডিফল্ট ক্রিয়া সহ একটি নিদর্শন, যা এটি print $0: flagসমান 1 হলে লাইনটি মুদ্রিত হয়।

আরও বিশদ বিবরণ এবং উদাহরণগুলির জন্য, একসাথে ক্ষেত্রে যখন নিদর্শনগুলি প্রদর্শিত হয় বা না দেখানো হয়, দেখুন দুটি প্যাটার্নের মধ্যে লাইন কীভাবে নির্বাচন করবেন?


30
আপনি যদি প্যাটার্নের মধ্যে এবং সহ সমস্ত কিছু মুদ্রণ করতে চান তবে আপনি ব্যবহার করতে পারেন awk '/abc/{a=1}/mno/{print;a=0}a' file
স্কাই

6
হ্যাঁ, @ এসএসই! বা এমনকি awk '/abc/{a=1} a; /mno/{a=0}' file- এটির সাথে aশর্তটি স্থাপনের আগে /mno/আমরা এটি সেট করার আগে লাইনটিকে সত্য হিসাবে (এবং এটি প্রিন্ট) মূল্যায়ন করি a=0। এইভাবে আমরা লেখা এড়াতে পারি print
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

12
@scai @fedorqui প্যাটার্ন আউটপুট অন্তর্ভুক্ত করার জন্য, আপনি এটি করতে পারেনawk '/abc/,/mno/' file
জোটনে

1
@ hkasera করা awk '/abc/{flag=1}/mno/{flag=0}flag' fileউচিত।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

2
@ আইরনিম এটি একটি অদ্ভুত দৃশ্য যা খুব বিভিন্ন উপায়ে পরিচালনা করা যায়: আপনি কোন লাইনগুলি মুদ্রণ করতে চান? সম্ভবত awk 'flag; /PAT1/{flag=1; next} /PAT1/{flag=0}' fileকরতে হবে।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

45

ব্যবহার sed:

sed -n -e '/^abc$/,/^mno$/{ /^abc$/d; /^mno$/d; p; }'

-nবিকল্প উপায়ে ডিফল্টরূপে প্রিন্ট হবে না।

প্যাটার্নটি কেবলমাত্র যুক্ত abcকরে রেখাগুলি সন্ধান mnoকরে এবং এরপরে ক্রিয়াগুলি কার্যকর করে { ... }। প্রথম ক্রিয়াটি abcলাইনটি মুছে দেয় ; দ্বিতীয় mnoলাইন; এবং pবাকি লাইনগুলি মুদ্রণ করে। আপনি প্রয়োজন অনুসারে রেজেক্সগুলি শিথিল করতে পারেন। abc.. mnoএর ব্যাপ্তির বাইরে যে কোনও লাইন কেবল মুদ্রিত নয়।


উত্তর এবং ব্যাখ্যা জন্য ধন্যবাদ! :)
dvai

@ জোনাথন লেফলার আমি জানতে পারি যে ব্যবহারের উদ্দেশ্য কী-e
কাসুন সিয়ামবলপিতিয়া

1
@ কাসুনসিয়াম্বলপিতিয়া: বেশিরভাগ ক্ষেত্রে এর অর্থ আমি এটি ব্যবহার করতে পছন্দ করি। সাধারণত, এটি নির্দিষ্ট করে যে পরবর্তী যুক্তিটি স্ক্রিপ্টের (অংশ) sedকার্যকর করা উচিত। আপনি যদি পুরো স্ক্রিপ্টটি অন্তর্ভুক্ত করতে চান বা বেশ কয়েকটি যুক্তি ব্যবহার করতে চান তবে আপনাকে অবশ্যই এই -eজাতীয় প্রতিটি যুক্তির আগে ব্যবহার করতে হবে ; অন্যথায়, এটি alচ্ছিক (তবে স্পষ্টত)।
জোনাথন লেফলার

@ জোনাথনলফলার ধন্যবাদ
কাসুন সিয়ামবালাপিতিয়া

নিস! (আমি আঁতকে ওঠার চেয়ে বেশি পছন্দ করি)) জটিল নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করার সময়, সেগুলি পুনরাবৃত্তি না করেই ভালো লাগবে। "নির্বাচিত" ব্যাপ্তির প্রথম / শেষ লাইনটি মোছা সম্ভব নয় কি? বা dপ্রথম ম্যাচ পর্যন্ত সমস্ত লাইনে প্রথমে প্রয়োগ করতে , এবং তারপরে dদ্বিতীয় ম্যাচ দিয়ে শুরু হওয়া সমস্ত লাইনে আরেকটি প্রয়োগ করতে চান?
hans_meine

18

এটি আপনার (জিএনইউ সেড) কাজ করতে পারে:

sed '/^abc$/,/^mno$/{//!b};d' file

শুরু হওয়া abcএবং রেখার মধ্যবর্তী লাইন বাদে সমস্ত লাইন মুছুনmno



এটা সত্যিই দারুন. {//!b}প্রতিরোধ abcএবং mnoথেকে আউটপুট মধ্যে অন্তর্ভুক্ত করা হচ্ছে, কিন্তু আমি কিভাবে চিন্তা করতে পারে না। আপনি ব্যাখ্যা করতে পারেন?
ব্রেন্ডন

1
@ ব্রেন্ডন নির্দেশনাটি //!bপড়ছে যদি বর্তমান লাইনটি কোনও একটি রেখা নয় যা রেঞ্জের সাথে মেলে, ব্রেক করে এবং সেই লাইনগুলি মুদ্রণ করে অন্যথায় সমস্ত লাইন মুছে ফেলা হয়।
পটং

13
sed '/^abc$/,/^mno$/!d;//d' file

golfs দুই বেশী ভালো অক্ষর ppotong এর {//!b};d

খালি ফরোয়ার্ড স্ল্যাশগুলির //অর্থ: "ব্যবহৃত সর্বশেষ নিয়মিত প্রকাশটি পুনরায় ব্যবহার করুন"। এবং কমান্ডটি আরও বোধগম্য হিসাবে একই কাজ করে:

sed '/^abc$/,/^mno$/!d;/^abc$/d;/^mno$/d' file

এটি পসিক্স বলে মনে হচ্ছে :

যদি একটি আর আর ফাঁকা থাকে (তবে কোনও প্যাটার্ন নির্দিষ্ট করা হয়নি) সেড এমন আচরণ করবে যাতে প্রয়োগ করা শেষ কমান্ডে ব্যবহৃত শেষ আরই প্রয়োগ করা হয় (হয় ঠিকানা হিসাবে বা বিকল্প কমান্ডের অংশ হিসাবে) নির্দিষ্ট করা হয়েছিল।


1
আমি মনে করি দ্বিতীয় সমাধানটি কিছুই না দিয়ে শেষ হবে কারণ দ্বিতীয় কমান্ডটিও একটি ব্যাপ্তি। তবে প্রথমে কুডোস।
পটং

@ পটং সত্য! প্রথমটি কেন কাজ করে আমাকে আরও অধ্যয়ন করতে হবে। ধন্যবাদ!
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

7

পূর্ববর্তী প্রতিক্রিয়াগুলির লিঙ্কগুলি থেকে, kshসোলারিসের উপর দিয়ে আমার জন্য এটি যে কাজ করেছিল তা হ'ল:

sed '1,/firstmatch/d;/secondmatch/,$d'
  • 1,/firstmatch/d: প্রথম লাইন 1 অবধি প্রথম বার পাওয়া পর্যন্ত firstmatch, মুছুন।
  • /secondmatch/,$d: secondmatchফাইলের শেষ হওয়া পর্যন্ত প্রথম উপস্থিতি থেকে মুছুন।
  • সেমিকোলন দুটি কমান্ড পৃথক করে যা ক্রমানুসারে কার্যকর করা হয়।

শুধু কৌতূহল, কেন রেঞ্জ সীমাবদ্ধ ( 1,) আগে আসে /firstmatch/? আমি অনুমান করছি এটিও কি উচ্চারণ করা যায় '/firstmatch/1,d;/secondmatch,$d'?
লুক ডেভিস

2
"1, / ফার্স্টমেচ / ডি" দিয়ে আপনি "লাইন 1 থেকে প্রথমবার প্রথমবার 'ফার্স্টমেচ' খুঁজে না পাওয়া পর্যন্ত মুছে ফেলছেন" বলছেন। "সেকেন্ডমেচ" এর প্রথম উপস্থিতি থেকে ফাইলের শেষ অবধি, "মুছে ফেলুন" এর সাথে "/ সেকেন্ডমেচ /, $ ডি" দিয়ে আপনি "মুছে ফেলুন"। সেমিকোলন দুটি কমান্ডকে পৃথক করে, যা ক্রমানুসারে কার্যকর করা হয়।
FanDeLaU

2
perl -lne 'print if((/abc/../mno/) && !(/abc/||/mno/))' your_file

পার্ল সমতুল্য হিসাবে জানা ভাল কারণ এটি অ্যাডক এবং শেড উভয়েরই বেশ ভাল বিকল্প।
আখন

2

এ জাতীয় কিছু আমার পক্ষে কাজ করে:

file.awk:

BEGIN {
    record=0
}

/^abc$/ {
    record=1
}

/^mno$/ {
    record=0;
    print "s="s;
    s=""
}

!/^abc|mno$/ {
    if (record==1) {
        s = s"\n"$0
    }   
}

ব্যবহার: awk -f file.awk data...

সম্পাদনা করুন: ও_ ফেডোরকি সমাধান আমার চেয়ে ভাল / প্রাকৃতিক tier


3
জিএনইউতে জাজুকটি if (record=1)হওয়া উচিত if (record==1), অর্থাৎ ডাবল = - গোক তুলনা অপারেটরগুলি দেখুন
জর্জ হকিন্স

2

Don_crissti এর উত্তর 2 টি মিলের প্যাটার্নের মধ্যে কেবল পাঠ্য দেখান ?

firstmatch="abc"
secondmatch="cdf"
sed "/$firstmatch/,/$secondmatch/!d;//d" infile

যা এডব্লিউকে এর প্রয়োগের চেয়ে অনেক বেশি দক্ষ, এখানে দেখুন


আমি মনে করি না যে সময়ের তুলনাগুলি এখানে যুক্ত করা খুব বেশি অর্থবোধ করে, যেহেতু প্রশ্নের প্রয়োজনীয়তাগুলি একেবারে আলাদা, সুতরাং সমাধানগুলি।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

2
আমি একমত নই কারণ উত্তরগুলির তুলনা করার জন্য আমাদের কিছু মানদণ্ড থাকা উচিত। মাত্র কয়েকজনের এসইডি অ্যাপ্লিকেশন রয়েছে।
লিও লোপোল্ড হার্টজ 준영

0

আমি awkপ্যাটার্ন 2 এর সাথে 2 প্যাটার্নের সাথে লাইনগুলি মুদ্রণের জন্য ব্যবহার করার চেষ্টা করেছি । এবং প্যাটার্ন 1 লাইনটিও মুদ্রণ করা উচিত।

যেমন উত্স

package AAA
aaa
bbb
ccc
package BBB
ddd
eee
package CCC
fff
ggg
hhh
iii
package DDD
jjj

এর একটি আউটপুট থাকা উচিত

package BBB
ddd
eee

প্যাটার্ন 1 যেখানে package BBB, প্যাটার্ন 2 হয় package \w*। নোট করুন যে CCCএকটি জ্ঞাত মান নয় তাই আক্ষরিকভাবে মেলা যায় না।

এই ক্ষেত্রে, @scai awk '/abc/{a=1}/mno/{print;a=0}a' fileবা @ ফেডরকিই awk '/abc/{a=1} a; /mno/{a=0}' fileআমার পক্ষে কাজ করে না।

অবশেষে, আমি এটি দ্বারা সমাধান করতে পরিচালিত awk '/package BBB/{flag=1;print;next}/package \w*/{flag=0}flag' file, হাহা

awk '/package BBB/{flag=1;print;next}flag;/package \w*/{flag=0}' fileপ্যাটার্ন 2 লাইনটিও মুদ্রণের জন্য আরও কিছু পরিশ্রমের ফলস্বরূপ , এটি হ'ল

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