Странная неконтролируемая прокрутка

Удивительно, но этот вопрос задают и отвечают на него по всему 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,несмотря на ссылка , нет.

1
12.07.2021, 01:26
0 ответов

Теги

Похожие вопросы