在 sed 替换字符串中转义 ' (单引号)

在 sed 替换字符串中转义 ' (单引号)

我有一个脚本,用于跨服务器执行一些 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.htmlman sed将详细介绍。这样,sed命令就不是 shell 所看到的内容的一部分(它只看到文件名),并且 shell 转义难题就消失了。

$ cat t.sed
s/'*/singlequote(s)/g

$ sed -f t.sed <<<"' ' '''"
singlequote(s) singlequote(s) singlequote(s)

相关内容