【发布时间】:2019-05-23 18:35:57
【问题描述】:
我正在尝试使用 sed 在文件中搜索和替换。但是 sed 似乎讨厌行尾特殊字符。
text=$(shuf text.txt)
echo "This is text:
$text"
sed -i "s~%text%~$text~g" t.txt
这是我得到的:
This is text:
line 2
line 1
line 3
line 4
sed: -e expression #1, char 15: unterminated `s' command
我尝试将 \n 替换为 \r,但结果并不令人满意。 有一个选项可以执行 tr '\n' , '$' 然后再向后执行,但它似乎不正确。
帮助?
【问题讨论】:
-
在
sed命令以换行符结尾。换行符是sed内的命令分隔符。所以s~blabla\n被 sed 解释为单个命令。but it doesn't seems right.- 这实际上是一个非常好的主意,我会说去吧。为了更加安全,请使用不可读的字符,例如tr '\n' $'\01' -
谢谢。那么有没有办法避免tr呢?
-
更好的方法是遇到
%text%时读取文件内容。另请注意,sed将解析\r\n等在$text中并替换它们,因此您可能会遇到“\”问题。有时这也可以通过另一个转义 sed 来解决...sed 's@%text%@$(<<<"$text" sed 's#\\#\\\\#g')/.... 但是,一如既往,awk 解决方案看起来很整洁。
标签: bash sed substitution end-of-line