سؤال استخدام التناوب "|" في تعبير السيد المسيح


أنا أستخدم sed، GNU sed version 4.2.1. أرغب في استخدام البديل "|" رمز في subexpression. فمثلا :

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

يجب أن يعود

" blib bou "

لكنها تعود

"blia blib bou blf".

كيف يمكنني الحصول على النتيجة المتوقعة؟


69
2018-02-22 14:31


الأصل




الأجوبة:


"|" يحتاج أيضًا إلى شرطة مائلة للخلف للحصول على معناه الخاص.

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

سوف تفعل ما تريد.

كما تعلم ، إذا فشل كل شيء آخر ، اقرأ الدليل :-).

دليل مستخدم جنو سيد، الجزء 3.3 نظرة عامة على صيغة التعبير العادي:

`REGEXP1 \ | REGEXP2"

تتطابق مع REGEXP1 أو REGEXP2.

لاحظ الخط المائل العكسي ...

لسوء الحظ ، لا يتم توحيد صيغة التعبير العادي في الواقع ... هناك العديد من المتغيرات ، والتي تختلف من بين أمور أخرى في "الأحرف الخاصة" تحتاج \ والتي لا تفعل ذلك. في بعض منها ، تكون قابلة للتكوين أو تعتمد على المفاتيح (كما هو الحال في غنو grep، والتي يمكنك التبديل بين ثلاثة لهجات منطقية مختلفة).

هذه الإجابة على وجه الخصوص هي ل جنو سيد. هناك المزيد sed المتغيرات ، على سبيل المثال تلك المستخدمة في BSDs ، والتي تتصرف بشكل مختلف.


101
2018-02-22 14:36



لأي شخص آخر مرتبك بهذه الإجابة \ يعمل فقط في جنو sed (gsed على os x) وليس الفانيليا (sed على os x). - Andrew Hancox
AndrewHancox أشكرك كثيرًا! كنت على وشك مزق الشعر كله من رأسي (وحتى الآن أقوم بعمل جيد مقارنة مع مديري على واجهة الشعر) - أعرف أنني أعرف ريجس بما فيه الكفاية لتجربة | و \ | ولكني لم أفكر أبدًا في حقيقة أن OSX قد تستخدم في الواقع حرفًا غير gnu. - phatskat
الإصدار القياسي BSD / OS X من sed يدعم التوافق ، ولكن فقط مع بناء الجملة المعتاد "الموسعة" (-E) - مما يعني عدم وجود خطوط مائلة عكسية على الأنابيب أو الأقواس: echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g' - Mark Reed
قمت بتحرير جوابي للإشارة إلى أنه من أجل GNU sed فقط. - sleske


بما أن هناك العديد من التعليقات بخصوص غير Gnu sed عمليات التنفيذ: على الأقل على OS X ، يمكنك استخدام -E حجة لsed:

تفسير التعبيرات العادية كتعبيرات عادية (حديثة) ممتدة بدلاً من التعبيرات العادية الأساسية (BRE's). تصف الصفحة اليدوية re_format (7) كليهما التنسيقات.

بعد ذلك ، يمكنك استخدام الحروف الأولية للتعبير العادي دون الإفلات منها. مثال:

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

17
2018-05-28 18:56





ال \| لا يعمل مع ساد على سولاريس 10 سواء. ما فعلته كان الاستخدام

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

9
2018-05-28 17:42



لإجراء 1+ للتحميل ، إذا كان النظام لديه perl ، فسيستخدم دائمًا هذه الصيغة ، على عكس sed. - evilsoup


غنو سيد يدعم أيضا -r الخيار (تمديد التعبيرات العادية). هذا يعني أنك لست مضطرًا للهروب من الحروف الأولية:

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

انتاج:

hi hi

9
2018-02-18 09:03



نعم فعلا، -r الخيار مفيد حقًا حقًا في قراءة التعبيرات. يجب أن يكون الجواب المقبول. - рüффп


متابعة: س -E يسمح به على ماك. لا حاجة للشرطة المائلة للخلف |

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

4
2017-08-28 20:15





في GnuWin32 على نظام التشغيل Windows سيد الصيغة sed "s/thing1\|thing2/ /g" source > destination.

يجب على الاقتباس من نوع " - هذا "مطلوب" حتى يتم تحليل الأمر.


1
2018-02-18 04:19