Удивительно, но этот вопрос задают и отвечают на него по всему Stack Exchange, но два обычно полезных ответа на этот очень резонный вопрос — это иголки в стоге сена. Они:
1. Экранируйте только 4 возможных специальных символа в вашей переменной
Как указано здесь (, несмотря на то, что вопрос стал жертвой отвращения SE к общим вопросам ), только 4 символа считаются специальными в замещающей части команды sed s
:\
, &
, новая строка и разделитель (обычно /
, но на самом деле могут быть чем угодно ).
Таким образом, чтобы использовать произвольную переменную в качестве замены в sed, сначала избегайте любых вхождений этих четырех символов, например так:
REPL='Arbitrary variable potentially with special characters like / and & and \ and
newline\
newline2'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
hexdump -C <<< "$REPL"
Например:
REPL='/&\
newline'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
sed "s/x/$REPL/" <<< "STARTxEND"
производит:
START/&\
newlineEND
как и ожидалось.
2. Используйте эквивалентный инструмент, который дословно интерпретирует замещающую переменную
perl
(ref)имеет эту возможность, потому что переменные (при условии, что они являются частью среды путем их экспорта или установки их в строке вызова ), являются гражданами первого класса. Примечание \Q
не требуется в строке замены (, но полезно в строке регулярного выражения ).
export REPL='/&\
newline'
perl -pe 's/x/$ENV{REPL}/' <<< "STARTxEND"
производит:
START/&\
newlineEND
awk
,несмотря на ссылка , нет.