Відповіді:
Значок "|" також потрібен зворотний нахил, щоб отримати його особливе значення.
echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
зробить те, що ти хочеш.
Як відомо, якщо все інше не вдасться, прочитайте посібник :-).
Посібник користувача GNU sed , розділ 3.3 Огляд синтаксису регулярних виразів :
`REGEXP1 \ | REGEXP2 '
Відповідає або REGEXP1, або REGEXP2.
Зверніть увагу на зворотний нахил ...
На жаль, синтаксис регулярних виразів насправді не стандартизований ... Є багато варіантів, які відрізняються між іншим, у яких "особливі символи" потребують \, а які ні. У деяких це навіть налаштовується або залежить від перемикачів (як у GNU grep
, яким ви можете перемикатися між трьома різними діалектами регулярних виразів).
Зокрема, ця відповідь стосується GNU sed . Є й інші sed
варіанти, наприклад, той, який використовується в BSD, які ведуть себе по-різному.
sed
підтримує чергування, але лише з "розширеним" синтаксисом регулярного виразів ( -E
) - що означає відсутність зворотних косих рисоків ні в трубах, ні в дужках:echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Оскільки існує декілька коментарів щодо не-Gnu- sed
реалізацій: Принаймні в OS X, ви можете використовувати -E
аргумент для sed
:
Інтерпретувати регулярні вирази як розширені (сучасні) регулярні вирази, а не основні регулярні вирази (BRE). Сторінка керівництва re_format (7) повністю описує обидва формати.
Тоді ви можете використовувати метахарактеристики регулярних виразів, не уникаючи їх. Приклад:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
GNU sed також підтримує -r
опцію (розширені регулярні вирази). Це означає, що вам не доведеться уникати метахарактерів:
echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Вихід:
hi hi
-r
варіант дійсно дуже корисний для читабельності виразів. Це повинна бути прийнята відповідь.
\|
Чи не працює з СЕД на Solaris 10 або. Що я зробив, було корисно
perl -p -e 's/bl(ia|f)//g'
Подальше: sed -E дозволяє це на MacOS. Не потрібно зворотної косої риси для |.
sed -E 's/this|orthat/oooo/g' infile