sed用多行代替变量

And*_*eas 7 variables bash sed

我试图用一个跨越多行的文本替换一个单词.我知道我可以简单地使用换行符\n来解决这个问题,但我想保持字符串"干净"任何不需要的格式.

以下示例显然不起作用:

read -r -d '' TEST <<EOI
a
b
c
EOI

sed -e "s/TOREPLACE/${TEST}/" file.txt
Run Code Online (Sandbox Code Playgroud)

有关如何实现这一点的任何想法没有修改以读取开始并以EOI结束的部分?

Tob*_*ght 6

鉴于您正在使用Bash,您可以使用它来替换\n换行符:

sed -e "s/TOREPLACE/${TEST//$'\n'/\\n}/" file.txt
Run Code Online (Sandbox Code Playgroud)

为了保持适当的健壮,你也想要逃避/,&而且\:

TEST="${TEST//\\/\\\\}"
TEST="${TEST//\//\\/}"
TEST="${TEST//&/\\&}"
TEST="${TEST//$'\n'/\\n}"
sed -e "s/TOREPLACE/$TEST/" file.txt
Run Code Online (Sandbox Code Playgroud)

如果你的匹配是整行并且你正在使用GNU sed,那么使用它的r命令可能更容易:

sed -e $'/TOREPLACE/{;z;r/dev/stdin\n}' file.txt <<<"$TEST"
Run Code Online (Sandbox Code Playgroud)


she*_*ter -1

一个有趣的问题..

这可能会让您更接近适合您的用例的解决方案。

read -r -d '' TEST <<EOI
a\\
b\\
c
EOI

echo TOREPLACE | sed -e "s/TOREPLACE/${TEST}/"
a
b
c
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。