Я запускаю несколько команд подстановки в качестве ядра сценария раскраски для maven . Одна из sed
команд использует регулярное выражение, которое работает в оболочке, как описано здесь . Текущую (не работающую) реализацию можно найти здесь .
Когда я включаю в скрипт один из вариантов команды, происходит другое поведение:
Вариант 1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Адаптировано к сценарию:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Ошибка: оболочка выводит такую же информацию, как если бы я печатал $ sed
. Странный!?
Вариант 2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Адаптировано к сценарию:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Ошибка:
sed: -e выражение # 7, char 59: недопустимая ссылка \ 1 в правой части команды `s '
regex
sed
substitution
JJD
источник
источник
-i
(редактировать в опции места) с-re
, в результате чего-ire
(так что-i
было потребляяre
фрагмент в качестве своегоSUFFIX
аргумента и , следовательно, режим расширенного регулярного выражения не быть включен); изменив его, чтобы-i -re
устранить проблему.'
и двойные кавычки"
обрабатываются немного по-разному, особенно при интерпретации$vars
. Например:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"
работает, но:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'
нет.Ответы:
Разве вам не нужно снимать, чтобы это работало? т.е. для варианта 2:
(Примечание: не проверено)
Без аргумента -r обратные ссылки (например, \ 1) работать не будут.
источник
-r
sed, по-видимому, необходим для работы обратной ссылки. Например,sed -e 's/([[:digit:]])/is a digit/'
работает, ноsed -e 's/([[:digit:]])/\1 is a digit/
выдает исходную ошибку без-r
sed. ПРИМЕЧАНИЕ: первый вызов sed ищет литерал(<digit>)
и не является группой захвата.-ire
вместо использования-ri
. Порядок имеет значение :-)Эта ошибка характерна для скобок, которые не экранированы. Убегите от них и попробуйте еще раз.
Например:
Перед каждой круглой скобкой следует использовать обратную косую черту:
источник
-r
вам не нужно избегать скобок.Если параметр
-r
/--regexp-extended
не указан, скобки захвата должны быть экранированы.источник
Вам нужно сбежать
/
после.
Или, если вы не хотите беспокоиться о побеге, используйте
|
РЕДАКТИРОВАТЬ:
источник
sed: -e expression #7, char 58: Invalid range end
. Ответ @Denis работает.