জিএনইউ বা বিএসডি সেডে রেজেক্স অল্টারনেশন / বা অপারেটর (foo | বার)


28

আমি এটি কাজ করে মনে হয় না। জিএনইউ সেড ডকুমেন্টেশনগুলি পাইপটি থেকে বাঁচতে বলেছে, তবে এটি কার্যকর হয় না, বা পালানো ছাড়া কোনও সরল পাইপ ব্যবহার করে না। পেরেনস যুক্ত করা কোনও পার্থক্য করে না।

$ echo 'cat
dog
pear
banana
cat
dog' | sed 's/cat|dog/Bear/g'
cat
dog
pear
banana
cat
dog

$ echo 'cat
dog
pear
banana
cat
dog' | sed 's/cat\|dog/Bear/g'
cat
dog
pear
banana
cat
dog

উত্তর:


33

ডিফল্টরূপে sedPOSIX বেসিক নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করে , যা |বিকল্প অপারেটরকে অন্তর্ভুক্ত করে না । sedজিএনইউ এবং ফ্রিবিএসডি সহ অনেকগুলি সংস্করণ বর্ধিত নিয়মিত এক্সপ্রেশনগুলিতে স্যুইচিং সমর্থন করে , যার মধ্যে |বিকল্প রয়েছে include আপনি কীভাবে এটি পরিবর্তন করেন: জিএনইউ সেড ব্যবহার করে-r , যখন ফ্রিবিএসডি , নেটবিএসডি , ওপেনবিএসডি এবং ওএস এক্স সেড ব্যবহার করে -E। অন্যান্য সংস্করণগুলি বেশিরভাগ ক্ষেত্রে এটিকে সমর্থন করে না। তুমি ব্যবহার করতে পার:

echo 'cat dog pear banana cat dog' | sed -E -e 's/cat|dog/Bear/g'

এবং এটি সেই বিএসডি সিস্টেমগুলিতে এবং জিএনইউতে কাজ করবে sed -r


জিএনইউতে sedসম্পূর্ণরূপে অননুমোদিত কিন্তু কার্যক্ষম সমর্থন রয়েছে বলে মনে হয় -E, সুতরাং যদি আপনার কাছে একটি মাল্টি-প্ল্যাটফর্ম স্ক্রিপ্ট থাকে যা উপরের দিকে সীমাবদ্ধ থাকে তবে এটি আপনার সেরা বিকল্প। যেহেতু এটি নথিভুক্ত নয় আপনি সম্ভবত এটির উপর নির্ভর করতে পারবেন না।

একটি মন্তব্যে উল্লেখ করা হয়েছে যে বিএসডি সংস্করণগুলিও -rএকটি অননুমোদিত উপনাম হিসাবে সমর্থন করে। ওএস এক্স এখনও নেই এবং পুরানো নেটবিএসডি এবং ওপেনবিএসডি মেশিনগুলি আমার কাছে নেই সেগুলি অ্যাক্সেস রয়েছে তবে নেটবিএসডি 6.1 রয়েছে one যে বাণিজ্যিক ইউনিটগুলি আমি সর্বজনীনভাবে পৌঁছাতে পারি সেগুলি না। সুতরাং এই যে সমস্ত বহনযোগ্যতা প্রশ্ন এই মুহূর্তে বেশ জটিল হয়ে উঠছে, তবে এর সহজ উত্তরটি আপনার প্রয়োজন হলে স্যুইচ করা হয়awk যা সর্বত্র EREs ব্যবহার করে।


তিন BSD গুলোর উল্লেখ করেছে সব সমর্থন -rএর সমার্থক হিসেবে বিকল্প -Eগনুহ সাথে সামঞ্জস্যের sed জন্য। ওপেনবিএসডি এবং ওএস এক্স এর sed -Eপালানো পাইপকে আক্ষরিক পাইপ হিসাবে ব্যাখ্যা করবে, বিকল্প অপারেটর হিসাবে নয়। এখানে নেটবিএসডি ম্যান পৃষ্ঠার একটি কার্যকারী লিঙ্ক এবং এখানে ওপেনবিএসডি এর একটি যা দশ বছরের পুরানো নয়।
দামেইন



9

এটি ঘটে কারণ (a|b)একটি বর্ধিত নিয়মিত প্রকাশ, বেসিক নিয়মিত এক্সপ্রেশন নয়। এটি -Eমোকাবেলায় বিকল্পটি ব্যবহার করুন ।

echo 'cat
dog
pear
banana
cat
dog'|sed -E 's/cat|dog/Bear/g'

থেকে sedমানুষ পৃষ্ঠা:

 -E      Interpret regular expressions as extended (modern) regular
         expressions rather than basic regular expressions (BRE's).

নোটটি -rএকই জিনিসটির জন্য আরেকটি পতাকা, তবে -Eএটি আরও বহনযোগ্য এবং এটি পসিক্স স্পেসিফিকেশনের পরবর্তী সংস্করণেও থাকবে।


6

এটি করার বহনযোগ্য উপায় - এবং আরও কার্যকর উপায় - ঠিকানাগুলির সাথে। তুমি এটি করতে পারো:

printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'

এইভাবে যদি লাইনটিতে স্ট্রিং বিড়ালটি না থাকে এবং স্ক্রিপ্টের বাইরে স্ট্রিং কুকুরটি থাকে না sed b, তার বর্তমান লাইনটি স্বতঃপ্রকাশ করে এবং পরবর্তী চক্রটি শুরু করতে পরবর্তী দিকে টান দেয়। সুতরাং পরবর্তী নির্দেশ সঞ্চালন করে না - যা এই উদাহরণে cপড়তে সমগ্র লাইন hanges বিয়ার কিন্তু এটি কিছু করতে পারে।

সম্ভবত এটি লক্ষণীয় !bযে sedকমান্ডের নীচে থাকা কোনও বিবৃতি কেবল স্ট্রিংযুক্ত একটি লাইনের সাথে মিলতে পারে dogবা cat- সুতরাং আপনি কোনও লাইন মেলানোর কোনও বিপদ ছাড়াই আরও পরীক্ষা চালাতে পারবেন - যার অর্থ আপনি এখন নিয়ম প্রয়োগ করতে পারবেন শুধুমাত্র এক বা অন্য হিসাবে।

তবে এরপরে। উপরের কমান্ড থেকে এখানে আউটপুট:

###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear

আপনি পিছনে উল্লেখগুলি সহ একটি লুকিং টেবিলটি বহনযোগ্যভাবে প্রয়োগ করতে পারেন।

printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'

এই সাধারণ উদাহরণস্বরূপ কেস সেটআপ করা আরও অনেক কাজ, তবে এটি sedদীর্ঘকালীন সময়ে আরও অনেক নমনীয় স্ক্রিপ্ট তৈরি করতে পারে ।

প্রথম লাইনে আমি xহোল্ড স্পেস এবং প্যাটার্ন স্পেস পরিবর্তন করে তারপরে আবার পরিবর্তন করার আগে স্ট্রিং <space>ক্যাট <space>কুকুরটিকে<space> হোল্ড স্পেসে x.োকান।

তারপরে এবং প্রতিটি নিম্নলিখিত লাইনে আমি Gস্থানটি প্যাটার্ন স্পেসের সাথে যুক্ত করে রাখি, তারপরে লাইনের শুরু থেকে শুরু হওয়া নতুন অক্ষর পর্যন্ত সমস্ত অক্ষর শেষের দিকে যুক্ত হওয়া একটি স্ট্রিং এর পরে ফাঁকা স্থানগুলিতে মেলে কিনা তা পরীক্ষা করে দেখুন। যদি তাই হয় তবে আমি পুরোটি অনেক ভালুকের সাথে প্রতিস্থাপন করব এবং যদি না হয় তবে কোনও ক্ষতি হয় না কারণ আমি পরবর্তী Pপ্যাটার্ন স্পেসে কেবলমাত্র প্রথম লাইন পর্যন্ত ছড়িয়ে পড়েছি তবে dএগুলি সমস্তই একত্রিত করব।

###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear

এবং যখন আমি নমনীয় বলি, আমি এটি বোঝাতে চাই। এখানে এটা প্রতিস্থাপন করা হয় বিড়াল সঙ্গে BrownBear এবং কুকুর সঙ্গে BlackBear :

printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'

###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear

আপনি অবশ্যই সন্ধানের টেবিলের বিষয়বস্তুগুলিতে একটি বিস্তৃত পরিমাণে প্রসারিত করতে পারেন - আমি গ্রেগ উবেনের ইউজনেট ইমেলগুলি থেকে এই বিষয়টি নিয়েছিলাম যখন 90 এর দশকে, তিনি বর্ণনা করেছিলেন যে কীভাবে তিনি একটি sed s///বিবৃতি থেকে ক্রুড ক্যালকুলেটরটি তৈরি করেছিলেন ।


1
ভাই, +1। আপনার কাছে বাক্সটি চিন্তা করার জন্য একটি
ছদ্মবেশ

@ 1_CR - আমার শেষ সম্পাদনাটি দেখুন - আমার ধারণা নয় - যা এই বলে যে আমি এর প্রশংসা করি না এবং এটি প্রশংসা হিসাবে বিবেচনা করি তা নয়। তবে আমি যেখানে dueণ দিতে চাই।
মাইক্রজারভ

1

এটি বেশ পুরানো প্রশ্ন, তবে কেউ চেষ্টা করতে চাইলে সেড ফাইল সহ সেড করার জন্য এখানে যথেষ্ট কম চেষ্টা করার উপায় রয়েছে। প্রতিটি বিকল্প পৃথক লাইনে তালিকাভুক্ত হতে পারে এবং সেড প্রতিটি মূল্যায়ন করবে। এটি বা এর যৌক্তিক সমতুল্য। উদাহরণস্বরূপ, একটি নির্দিষ্ট কোডযুক্ত লাইনগুলি সরাতে:

তুমি বলতে পারো : sed -E '/^\/\*!(40103|40101|40111).*\/;$/d'

অথবা এটি আপনার এসড ফাইলের মধ্যে রাখুন:

/^\/\*!40103.*\/;$/d
/^\/\*!40101.*\/;$/d
/^\/\*!40111.*\/;$/d

0

এখানে এমন একটি কৌশল রয়েছে যা কোনও প্রয়োগের নির্দিষ্ট বিকল্পগুলির sed(যেমন -E, -r) ব্যবহার করে না । একক রেজেক্স হিসাবে প্যাটার্নটি বর্ণনা করার পরিবর্তে cat|dog, আমরা কেবল sedদু'বার চালাতে পারি :

echo 'cat
dog
pear
banana
cat
dog' | sed 's/cat/Bear/g' | sed 's/dog/Bear/g'

এটি প্রকৃতপক্ষে একটি স্পষ্টতই কাজ, তবে ভাগ করে নেওয়ার মতো। এটি স্বাভাবিকভাবেই দুটিরও বেশি প্যাটার্নের স্ট্রিংগুলিকে সাধারণীকরণ করে, যদিও এর একটি দীর্ঘ দীর্ঘ চেইন sedখুব ভাল দেখাচ্ছে না।

আমি প্রায়শই sed -iফাইলগুলিতে পরিবর্তন করতে (যা সমস্ত প্রয়োগে একই কাজ করে) ব্যবহার করি। এখানে, প্যাটার্ন স্ট্রিংগুলির একটি দীর্ঘ তালিকা সুন্দরভাবে সংযুক্ত করা যেতে পারে, কারণ প্রতিটি অস্থায়ী ফলাফল ফাইলটিতে সংরক্ষণ করা হয়:

for pattern in cat dog owl; do
    sed -i "s/${pattern}/Bear/g" myfile
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.