【发布时间】:2011-10-04 19:08:12
【问题描述】:
我正在尝试用跨越多行的文本替换一个单词。我知道我可以简单地使用换行符 \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"
【讨论】:
您可以编写如下脚本:
sed -e 's/TOREPLACE/a\
b\
c\
/g' file.txt
有点神秘,但它有效。另请注意,除非您使用 -i 选项,否则不会就地修改文件。
【讨论】:
read 将回车转换为空格,所以无论如何你都应该再次插入回车。
棘手...但我的解决方案是:-
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
重要: 确保使用正确的反引号、单引号、双引号和空格 否则将无法正常工作。
【讨论】:
一个有趣的问题..
这可能会让您更接近针对您的用例的解决方案。
read -r -d '' TEST <<EOI
a\\
b\\
c
EOI
echo TOREPLACE | sed -e "s/TOREPLACE/${TEST}/"
a
b
c
我希望这会有所帮助。
【讨论】: