sed 用多行变量替换行

Bjo*_*orn 5 bash sed multiline

我试图用存储在变量中的多行字符串替换文件中的一行。

打印到屏幕时我能够得到正确的结果,但如果我想进行就地替换则不行。

该文件具有以下形式:

*some code*
*some code*
string_to_replace
*some code*
Run Code Online (Sandbox Code Playgroud)

我希望生成的文件是:

*some code*
*some code*
line number 1
line number 2
line number 3
*some code*
Run Code Online (Sandbox Code Playgroud)

我试过的代码是:

new_string="line number 1\nline number 2\nline number 3"

# Correct output on screen
sed -e s/"string_to_replace"/"${new_string}"/g $file

# Single-line output in file: "line number 1line number 2line number 3"
sed -i s/"string_to_replace"/"${new_string}"/g $file
Run Code Online (Sandbox Code Playgroud)

尝试组合-i-e选项时,结果与仅使用-i.

我在 CentOS 上使用 GNU sed 4.1.5 版(通过 Mac 的 ssh 连接到它)。

小智 3

您可以sed双引号命令字符串并让 shell 为您进行扩展,如下所示:

new_string="line number 1\nline number 2\nline number 3"
sed -i "s/string_to_replace/$new_string/" file
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于“sed”方言,它将转义码“\n”扩展为文字换行符;这种行为不是标准的或可移植的。 (2认同)