Я хотел бы заменить строку переменной a, которая содержит символы новой строки. Однако замена sed
, похоже, не дает того, что я хочу.
str = ""
str+ = "#My header 1"$'\n'
str+ = "#My header 2"$'\n'
str+ = "#My header 3"$'\n'
echo "$str"
#My header 1
#My header 2
#My header 3
sed "s/##HEADER##/${str}/g" myfile.out
К сожалению, это не работает, получая следующую ошибку:
sed: -e expression #1, char 25: unterminated s command
Есть еще идеи?
@testing-ma-lady Нет, не делала. Однако это работает! Не могли бы вы указать это в ответе, чтобы принять его?
Я редко использую sed
, но считаю, что буквальные символы новой строки внутри строки замены не допускаются.
Вам нужно избегать обратных косых черт, повторяя их:
\\n
bash
расширяется $'\n'
как настоящий символ новой строки (код ASCII 10). Таким образом, ваша переменная str
содержит 3 символа новой строки. Однако символы новой строки имеют значение для sed
. Он использует их как разделители команд (помимо прочего). Если вы хотите, чтобы sed
выводил символ новой строки, и если ваш sed
поддерживает это (например, GNU sed
), вы можете закодировать его как \n
. Пример добавления новой строки после слова foo
:
sed 's/foo/foo\n/' <<< "barfoobar"
barfoo
bar
В вашем случае не используйте $'\n'
, используйте простой \n
в текстовой строке:
str = ""
str+ = "#My header 1\n"
str+ = "#My header 3\n"
str+ = "#My header 2\n"
sed "s/##HEADER##/${str}/g" myfile.out
Обратите внимание, что интерпретация \n
(и некоторых других подобных escape-последовательностей) не является стандартной функцией sed
. Насколько я знаю, это работает только в GNU sed
.
@GordonDavisson Вы правы, POSIX указывает, что \n
поддерживается в регулярном выражении, но не обязательно в заменяющем тексте. Обратите внимание, что sed
, поставляемый с macOS (я думаю, BSD sed
), также поддерживает его.
Вы пробовали
\\n
вместо\n
?