重击替换为sed。行尾问题

时间:2019-05-23 18:35:57

标签: bash sed substitution end-of-line

我正在尝试使用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','$',然后事后倒退,但这似乎不正确。

帮助?

1 个答案:

答案 0 :(得分:3)

使用sed和bash

由于您正在使用bash,请尝试:

sed -i "s~%text%~${text//$'\n'/\\n}~g" t.txt

${text//$'\n'/\\n}是bash的模式替换的示例。 在这种情况下,它将所有换行符替换为反斜杠,后跟nsed将被解释为换行符。

示例

考虑此text变量:

$ echo "$text"
line 2
 line 1
 line 3
 line 4

此输入文件:

$ cat t.txt
start
%text%
end

现在,运行我们的命令:

$ sed "s~%text%~${text//$'\n'/\\n}~g" t.txt
start
line 2
 line 1
 line 3
 line 4
end

当然,要就地更改文件,请重新添加-i选项。

使用awk

具有与上述相同的text变量和t.txt文件:

$ awk -v new="$text" '{gsub(/%text%/, new)} 1' t.txt
start
line 2
 line 1
 line 3
 line 4
end