我有一个脚本,用于跨服务器执行一些 iptables 更改。在脚本中,我有一个 sed 命令来查找字符串并在该行之前插入 iptables 规则。
我遇到的问题是我正在编辑的文件是一个 yaml 文件,我需要在该行中有一个“和”。
如果我从插入的内容中删除 ' ,它就会起作用。
$ sed 's/.*output_snat_lo.conf:.*/- -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1\n&/' file.yaml
- '-t nat -A POSTROUTING -s 192.168.1.25/32 -d 10.0.0.1 -j SNAT --to-source 172.1.1.1'
- -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1
output_snat_lo.conf:
但是,如果我尝试用斜杠转义它或将其放在双引号内,带斜杠的双引号我无法打印 ' 而是给出发送无效标志选项。
这就是我要插入的内容。
- '-t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1'\n&/' file.yaml
有什么建议/技巧吗?我觉得我过去曾经这样做过,但不记得是怎么做的。
答案1
关闭您要放入正则表达式的单引号,转义单引号,然后再次打开它
$ echo "a'b" | sed 's/'\''/X/'
aXb
$ echo "aXb" | sed 's/X/'\''/'
a'b
答案2
你不需要在 sed 中转义,那里'
没有特殊意义。你需要在 bash 中转义它。
$ sed -e "s/'/singlequote/g" <<<"'"
singlequote
您可以在此处看到双引号保护单引号免受 bash 的影响,而 sed 则可以很好地处理它。以下是切换单引号时会发生的情况。
$ sed -e 's/'/singlequote/g' <<<"'"
>
在像 bourne 这样的 shell(全部?)中,奇怪的事情'
是它的功能不太像,"
而更像一个标志,用于禁用其他字符解释,直到'
看到另一个字符。如果将其用双引号括起来,则不会有特殊意义。观察:
$ echo 'isn'"'"'t this hard?'
isn't this hard?
您还可以使用反斜杠对其进行转义,如其他答案所示。但你必须离开之前的单引号块将起作用。因此,虽然这看起来可行:
echo '\''
它不是;第一个'
禁用字符的含义\
。
我建议你采取不同的方法。sed
表达式可以指定为命令行参数 - 但代价是必须从 shell 中转义。转义一个简短的 sed 表达式还不错,但是你的表达式相当长并且有很多特殊字符。
我会将您的sed
命令放入一个文件中,并使用参数调用sed
来-f
指定命令文件,而不是在命令行中指定它。http://man7.org/linux/man-pages/man1/sed.1.html或man sed
将详细介绍。这样,sed
命令就不是 shell 所看到的内容的一部分(它只看到文件名),并且 shell 转义难题就消失了。
$ cat t.sed
s/'*/singlequote(s)/g
$ sed -f t.sed <<<"' ' '''"
singlequote(s) singlequote(s) singlequote(s)