我想用sed我自己的字符串替换特定行,该字符串必须包含一些嵌套引号,因为它将被另一个程序读取并本身执行命令。
sed -i '63s/^.*$/mystring/' file.txt
其中63是行号,^.*$是选择要替换的整行,mystring是替换字符串,file.txt是要处理的文件。
举例来说,我想mystring exec: echo 'echo "127.0.0.1 localhost" >> /etc/hosts"'知道我该怎么做?我尝试过转义引号。
例如,您可以执行以下操作:
sed -i.bak "63s|^.*$|$string|" file.txt
Run Code Online (Sandbox Code Playgroud)
一种方法是从文件中获取它。另外,请注意双引号sed是扩展变量所必需的。最后,使用另一个分隔符sed并将其存储$string在变量中。例如,|。这是因为您$string包含斜杠,并且 makesed会看到类似 的命令sed "s/^.*$/something/blabla/",其中有很多斜杠。
另外,创建-->-i.bak的备份。file.txtfile.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
Run Code Online (Sandbox Code Playgroud)
如果您不想进行变量赋值,则只需转义替换字符串中的有问题的字符即可。在这种情况下,只需双引号":
sed -i.bak "63s|^.*$|exec: echo 'echo \"127.0.0.1 localhost\" >> /etc/hosts\"'|" file.txt
^ ^ ^
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)