sed用包含嵌套引号的字符串替换行号处的整行

时间:2014-06-12 15:27:49

标签: regex bash sed

我想使用sed用我自己的字符串替换某一行,该字符串必须包含一些嵌套引号,因为它将由另一个程序读取并自己执行命令。

sed -i '63s/^.*$/mystring/' file.txt

63是行号,^.*$选择要替换的整行,mystring是替换字符串,file.txt是要处理的文件。< / p>

比方说,我想让mystring exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'我该怎么做?我试图逃避报价。

3 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

sed -i.bak "63s|^.*$|$string|" file.txt

从文件中获取它的方法。另外,注意sed中的双引号是扩展变量所必需的。 最后,使用sed的另一个分隔符并将$string存储在变量中。例如,|。这是因为您的$string包含斜杠,并使sed看到像sed "s/^.*$/something/blabla/"这样的命令,这是很多斜杠。

此外,-i.bak会创建file.txt的备份 - &gt; file.txt.bak

测试

$ cat a
hel
lo
ooo
bye
$ cat b
exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'
$ string=$(cat b)

$ sed "3s|^.*$|$string|" a
hel
lo
exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'
bye

如果您不想进行变量赋值,那么只需转义替换字符串中有问题的字符即可。在这种情况下,只需双引号"

sed -i.bak "63s|^.*$|exec: echo 'echo \"127.0.0.1 localhost\" >> /etc/hosts\"'|" file.txt
                                      ^                    ^               ^

测试

$ sed "3s|^.*$|exec: echo 'echo \"127.0.0.1 localhost\" >> /etc/hosts\"'|" a
hel
lo
exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'
bye

答案 1 :(得分:3)

这可能适合你(GNU sed&amp; Bash):

cat <<\! >quoted-text.txt
exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'
!

sed $'63{r quoted-text.txt\nd}' file

将困难的文本行放入文件中,并通过读取所述文件并删除原始行来替换所需的行。

答案 2 :(得分:2)

你也可以试试这个,

sed -i "63s~.*~exec: echo \'echo \"127.0.0.1 localhost\" >> /etc/hosts\"\'~g" file

只需要转义引号和不同的sed分隔符。

<强> *示例:

$ sed "2s~.*~exec: echo \'echo \"127.0.0.1 localhost\" >> /etc/hosts\"\'~g" file
abc, xym krg plf, 763, bla
exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'