sed用多行代替变量

时间:2011-07-13 19:30:14

标签: bash variables sed

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

以下示例显然不起作用:

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

sed -e "s/TOREPLACE/${TEST}/" file.txt

有关如何实现此目的的任何想法,不修改以读取开头并以EOI结束的部分?

4 个答案:

答案 0 :(得分:5)

鉴于您正在使用Bash,您可以使用它来替换{​​{1}}换行:

\n

为了保持健全,您也想要逃离sed -e "s/TOREPLACE/${TEST//$'\n'/\\n}/" file.txt /&

\

如果您的匹配是整行并且您正在使用GNU sed,则可能更容易使用其TEST="${TEST//\\/\\\\}" TEST="${TEST//\//\\/}" TEST="${TEST//&/\\&}" TEST="${TEST//$'\n'/\\n}" sed -e "s/TOREPLACE/$TEST/" file.txt 命令:

r

答案 1 :(得分:1)

您可以按如下方式编写脚本:

sed -e 's/TOREPLACE/a\
b\
c\
/g' file.txt

有点神秘,但它确实有效。另请注意,除非您使用-i选项,否则不会对文件进行修改。

答案 2 :(得分:1)

棘手......但我的解决方案是: -

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

sed -e "s/TOREPLACE/`echo "$TEST"|awk '{printf("%s\\\\n", $0);}'|sed -e 's/\\\n$//'`/g" file.txt

重要:  确保使用正确的反引号,单引号,双引号和空格  否则它将无效。

答案 3 :(得分:0)

一个有趣的问题..

这可以让您更接近用例的解决方案。

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

echo TOREPLACE | sed -e "s/TOREPLACE/${TEST}/"
a
b
c

我希望这会有所帮助。