У меня возникли некоторые проблемы с заменой строки в файле, используя sed на строку, которая содержит переводы строк. Следующее не получится полностью. Я предполагаю, что мне нужно экранировать строку replace_with, но я не могу понять, как, или если это даже лучший способ сделать это. Любая помощь будет оценена

REPLACE_WITH="Blah
 de
 blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file

1 ответ1

0

Для этого необходимо "двойное экранирование", но экранирующие символы должны получить команду "s", чтобы их тоже можно было экранировать из оболочки bash. ("Тройной побег"?)

REPLACE_WITH="Blah\\
de\\
blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file

Bash декодирует «\\» в один «\» и помещает один «\» в команду "send", которую команда sed затем интерпретирует как «\{newline}», что означает новую строку, которая не заканчивается команда.

Если бы у вас был только один '\' в конце каждой строки, bash увидит '\{newline}', который будет воспринят как «ничто», то есть: новая строка и обратная косая черта полностью удалены.

Основное правило для bash-sed-awk ... если ваши обратные слеши не работают, попробуйте удвоить их ... снова.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .