Ответ 1
Вам не нужно действительно захватывать, чтобы это сработало? то есть для варианта 2:
-e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \
(Примечание: непроверенный)
Я запускаю несколько команд подстановки в качестве ядра 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
Вам не нужно действительно захватывать, чтобы это сработало? то есть для варианта 2:
-e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \
(Примечание: непроверенный)
Эта ошибка является общей для круглых скобок, которые не экранированы. Побег их и повторите попытку.
Например:
/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g
Следует избегать обратных косых черт перед каждой скобкой:
/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g
Вам нужно выйти из /
после .
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"