Почему регулярное выражение с \\ $ \ {работает с 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), поэтому рекомендуется обходное решение, даже если вы не можете воспроизвести ошибку с более новыми версиями.

Если вы используете 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 по крайней мере не меньше числа строк.)