我想使用sed
用我自己的字符串替换某一行,该字符串必须包含一些嵌套引号,因为它将由另一个程序读取并自己执行命令。
sed -i '63s/^.*$/mystring/' file.txt
63
是行号,^.*$
选择要替换的整行,mystring
是替换字符串,file.txt
是要处理的文件。< / p>
比方说,我想让mystring
exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'
我该怎么做?我试图逃避报价。
答案 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"'