Sed error: команда "invalid reference\1 on` s RHS"

Я запускаю несколько команд подстановки в качестве ядра colorize script для maven. Одна из команд sed использует регулярное выражение, которое работает в оболочке как обсуждаемое здесь. Текущую (нерабочую) реализацию можно найти здесь.

Когда я включаю один из вариантов команды в script, возникает другое поведение:

Вариант 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

Адаптировано к script:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

Ошибка: Оболочка выводит ту же информацию, что и если бы я набрал $ sed. Странно!?


Вариант 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

Адаптировано к script:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

Ошибка:

sed: -e выражение # 7, char 59: команда invalid reference\1 on `s RHS

Ответ 1

Вам не нужно действительно захватывать, чтобы это сработало? то есть для варианта 2:

-e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(Примечание: непроверенный)

Ответ 2

Эта ошибка является общей для круглых скобок, которые не экранированы. Побег их и повторите попытку.


Например:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

Следует избегать обратных косых черт перед каждой скобкой:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g

Ответ 3

Вам нужно выйти из / после .

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

Или, если вы не хотите беспокоиться об экранировании, используйте |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

EDIT:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"