我正在尝试用跨越多行的文本替换单词。我知道我可以简单地使用换行符\ n来解决这个问题,但我想保持字符串“干净”任何不需要的格式。
以下示例显然不起作用:
read -r -d '' TEST <<EOI
a
b
c
EOI
sed -e "s/TOREPLACE/${TEST}/" file.txt
有关如何实现此目的的任何想法,不修改以读取开头并以EOI结束的部分?
答案 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
我希望这会有所帮助。