<分区>
我正在尝试用跨越多行的文本替换一个词。我知道我可以简单地使用换行符\n 来解决这个问题,但我想保持字符串“干净”的任何不需要的格式。
下面的例子显然行不通:
read -r -d '' TEST <<EOI
a
b
c
EOI
sed -e "s/TOREPLACE/${TEST}/" file.txt
关于如何在不修改以 read 开始并以 EOI 结束的部分的情况下实现这一目标的任何想法?
<分区>
我正在尝试用跨越多行的文本替换一个词。我知道我可以简单地使用换行符\n 来解决这个问题,但我想保持字符串“干净”的任何不需要的格式。
下面的例子显然行不通:
read -r -d '' TEST <<EOI
a
b
c
EOI
sed -e "s/TOREPLACE/${TEST}/" file.txt
关于如何在不修改以 read 开始并以 EOI 结束的部分的情况下实现这一目标的任何想法?
最佳答案
鉴于您使用的是 Bash,您可以使用它来替换 \n
换行符:
sed -e "s/TOREPLACE/${TEST//$'\n'/\\n}/" file.txt
为了适本地健壮,您还需要转义 /
、&
和 \
:
TEST="${TEST//\\/\\\\}"
TEST="${TEST//\//\\/}"
TEST="${TEST//&/\\&}"
TEST="${TEST//$'\n'/\\n}"
sed -e "s/TOREPLACE/$TEST/" file.txt
如果您的匹配是整行并且您使用的是 GNU sed,那么使用它的 r
命令可能会更容易:
sed -e $'/TOREPLACE/{;z;r/dev/stdin\n}' file.txt <<<"$TEST"
关于bash - sed 用多行替换变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6684487/