সেডের রেজেজেটে বিকল্প | "|" ব্যবহার করুন


78

আমি সেড, জিএনইউ সেড সংস্করণ 4.2.1 ব্যবহার করছি। আমি বিকল্পটি "|" ব্যবহার করতে চাই একটি subexpression মধ্যে প্রতীক। উদাহরণ স্বরূপ :

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

ফিরে আসা উচিত

" blib bou "

কিন্তু এটি ফিরে আসে

"blia blib bou blf".

আমি কীভাবে প্রত্যাশিত ফলাফল পেতে পারি?

উত্তর:


110

"|" এছাড়াও এর বিশেষ অর্থ পেতে একটি ব্যাকস্ল্যাশ দরকার।

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

আপনি যা চান তা করবে

যেমন আপনি জানেন, অন্য সমস্ত কিছু যদি ব্যর্থ হয় তবে ম্যানুয়ালটি পড়ুন :-)।

জিএনইউ সেড ব্যবহারকারীর ম্যানুয়াল , বিভাগ ৩.৩ নিয়মিত এক্সপ্রেশন সিনট্যাক্সের ওভারভিউ :

`REGEXP1 \ | REGEXP2 '

REGEXP1 বা REGEXP2 এর সাথে মেলে।

ব্যাকস্ল্যাশ নোট করুন ...

দুর্ভাগ্যক্রমে, রেজেক্স সিনট্যাক্সটি আসলেই মানসম্মত নয় ... অনেকগুলি রূপ রয়েছে, যা অন্যান্য জিনিসের মধ্যে পৃথক হয় যেখানে "বিশেষ অক্ষরগুলির" প্রয়োজন হয় which এবং যা না। কিছুতে এটি এমনকি কনফিগারযোগ্য বা সুইচগুলির উপর নির্ভর করে (জিএনইউ হিসাবে grep, যা আপনি তিনটি ভিন্ন রেজেক্স উপভাষার মধ্যে স্যুইচ করতে পারেন)।

বিশেষত এই উত্তরটি GNU সেডের জন্য । অন্যান্য sedরূপগুলি রয়েছে, উদাহরণস্বরূপ, BSDs এ ব্যবহৃত একটি, যা ভিন্ন আচরণ করে।


35
এই উত্তর দ্বারা বিভ্রান্ত অন্য কারও জন্য \ | শুধুমাত্র gnu সেডে কাজ করে (OS x তে গেসড) ভ্যানিলা সেড নয় (ওএস এক্স উপর সেড)।
অ্যান্ড্রু হ্যানকক্স

@ অ্যান্ড্রুহানকক্স আপনাকে অনেক ধন্যবাদ! আমি আমার মাথা থেকে সমস্ত চুল ছিঁড়ে ফেলতে যাচ্ছিলাম (এবং এ পর্যন্ত আমি চুলের সম্মুখভাগে আমার ম্যানেজারের তুলনায় বেশ ভাল কাজ করছি) - আমি জানি আমি চেষ্টা করি যথেষ্ট রেজিএক্স | এবং \ | তবে আমি কখনই ওএসএক্স একটি নন-জিএনও সেড ব্যবহার করতে পারি সে সম্পর্কে কখনও ভাবিনি।
ফটস্কট

8
স্ট্যান্ডার্ড বিএসডি / ওএস এক্স সংস্করণটি sedবিকল্পটিকে সমর্থন করে তবে কেবল "বর্ধিত" রেজেক্স সিনট্যাক্স ( -E) দিয়ে - যার অর্থ পাইপ বা বন্ধনীগুলির কোনও পিছনে নেই:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
মার্ক রিড

2
আমি আমার উত্তরটি সম্পাদনা করে নোট করেছিলাম যে এটি কেবল জিএনইউ সেডের জন্য।
স্ল্যাসকে

22

যেহেতু নন-গনু sedবাস্তবায়ন সম্পর্কিত বেশ কয়েকটি মন্তব্য রয়েছে : কমপক্ষে ওএস এক্সে, আপনি এই -Eযুক্তিটি  ব্যবহার করতে পারেন sed:

বেসিক নিয়মিত এক্সপ্রেশন (বিআরই) এর পরিবর্তে নিয়মিত এক্সপ্রেশনকে বর্ধিত (আধুনিক) নিয়মিত এক্সপ্রেশন হিসাবে ব্যাখ্যা করুন। পুনরায় ফর্ম্যাট (7) ম্যানুয়াল পৃষ্ঠা উভয় ফর্ম্যাটকে পুরোপুরি বর্ণনা করে।

তারপরে আপনি নিয়মিত এক্সপ্রেশন মেটাচ্যাক্টরগুলি এড়িয়ে না গিয়ে ব্যবহার করতে পারেন। উদাহরণ:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou 

12

জিএনইউ সেড -rবিকল্পটি সমর্থন করে (নিয়মিত এক্সপ্রেশনগুলি বাড়িয়ে তোলে)। এর অর্থ আপনাকে মেটাচ্যাক্টরগুলি থেকে বাঁচতে হবে না:

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

আউটপুট:

hi hi

হ্যাঁ, -rবিকল্পটি প্রকাশের পাঠযোগ্যতার জন্য সত্যই সহায়ক। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
рüффп

9

\|পারেন সোলারিস 10 sed সঙ্গে কাজ করে না। আমি যা করেছি তা ব্যবহার ছিল

perl -p -e 's/bl(ia|f)//g'

2
বহনযোগ্যতার জন্য +1, যেহেতু কোনও সিস্টেমে পার্ল থাকে তবে সেগুলি সর্বদা এই সিনট্যাক্সটি ব্যবহার করবে, শেডের বিপরীতে।
অরিসুপ

4

ফলোআপ: সেড -E এটি ম্যাকওএস এ অনুমতি দেয়। কোন ব্যাকস্ল্যাশ প্রয়োজন নেই।

 sed -E 's/this|orthat/oooo/g' infile

1

উইন্ডোজে GnuWin32 এ সিডেক্সটি সিডেক্স sed "s/thing1\|thing2/ /g" source > destination

উদ্ধৃতিগুলি অবশ্যই টাইপ করতে হবে "- কমান্ডটি বিশ্লেষণ করার জন্য এটি "প্রয়োজনীয়"।

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