Почему регулярное выражение с \\ $ \ {работает с egrep, но не с sed?

Учитывая такой текст

./RFF_09 -f${FILE} -c${COND} 

внутри файла команда egrep будет правильно соответствовать:

 egrep './RFF(.*) (.*)-c\\$\{COND\}' file 

но эта команда sed не будет

 sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':./RFF$1 $2-cRFF$1:gp" 

Он будет терпеть неудачу с sed: -e expression #1, char 38: invalid content of \{\} . Я также пробовал

 sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp" file sed -ns:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp file 

с тем же результатом.

 sed -n "s:'./RFF(.*) (.*)-c\\$\\{COND\\}':DUMMY:gp" file 

Не даст мне сообщение об ошибке, но не будет соответствовать.

Что я делаю не так? Или лучше: как я могу заменить текст, как это было предложено исходной командой? Я использую довольно старые версии sed (4.1.2) и egrep (2.5.1), поэтому рекомендуется обходное решение, даже если вы не можете воспроизвести ошибку с более новыми версиями.

2 Solutions collect form web for “Почему регулярное выражение с \\ $ \ {работает с egrep, но не с sed?”

Если вы используете e grep, означающий grep с расширенным синтаксисом regexp, чтобы иметь возможность передавать ваш шаблон в sed, вы должны добавить parametr -r(--regexp-extended) или -E в некоторых версиях.

Что касается вашего выражения, у вас есть дополнительный \ после c поэтому даже с egrep он не соответствует

Кроме того, лучше использовать \1 вместо $1 для обратного сопоставления.

Таким образом, окончательная команда может быть:

 sed -rn 's:\./(RFF.*)( .* -c)\$\{COND\}:./\1\2\1:gp' 

Или

 sed -rn 's:(\./(RFF\S*) \S* -c)\$\{COND\}:\1\2:gp' 

В исходном заявлении проблема заключается в том, что вы смешиваете синтаксические и литературные кавычки : одинарные кавычки в двойных кавычках будут сопоставляться буквально. Вы захотите либо просто удалить их, либо смешать кавычки ( не вставлять их). Неподтвержденные примеры:

 sed 's/foo/{bar}/' sed "s/foo/"'{bar}'"/" 

Есть много вариантов регулярных выражений , и все они поддерживают разные синтаксисы. В попытке использовать только одинарные кавычки проблема заключается в регулярном выражении: sed использует \{N\} для совпадений совпадений, поэтому N должно быть целым числом. Вместо этого вы хотите использовать {COND} .

(Поистине, использование регулярного выражения для решения проблемы теперь означает, что у вас есть две проблемы. И в целом что-то сложное в коде оболочки означает, что у вас есть N проблем, N по крайней мере не меньше числа строк.)

  • Команда Grep для поиска файлов, содержащих текстовую строку, и перемещения их
  • Извлечь часть строки, используя grep
  • egrep несколько шаблонов с тире
  • Что я делаю неправильно, пытаясь написать сценарий bash, который возвращает номер следующего доступного порта?
  • Как составить список всех процессов, назначенных пользователю в кластере
  • Grep для дат старше 14 дней в файле
  • GNU параллельна чрезмерно медленной
  • Как grep для одиночной цитаты?
  • Считайте уникальные строки только для заданного шаблона
  • Как объединить две команды grep и отобразить их результаты вместе?
  • Выберите строки, начинающиеся с определенных номеров
  • Linux и Unix - лучшая ОС в мире.