在sed中引用和反斜杠

时间:2017-12-20 14:10:29

标签: bash sed escaping

我有一个我想用sed替换的字符串,完全是这样的:

\'string\'

包含\'。我想替换为,假设 quotedstring ,但尝试了很多方法,但没有成功。无效的示例:

  • sed "s:\'string\':quotedstring:g"
  • sed "s:\\'string\\':quotedstring:g"
  • sed 's:\\\'string\\\':quotedstring:g'
  • sed 's:\\'string\\':quotedstring:g'

2 个答案:

答案 0 :(得分:3)

sed "s/\\\'string\\\'/replace/"

您的示例存在问题:

  • sed 's:foo:bar:g'您不能在单引号内使用单引号'
  • sed "s:\'string\':replace:g"如果反斜杠后面的字符在双引号"中没有特殊含义,bash 将不会将其删除。因此,sed将真正收到\'\'sed中的特殊序列,请参阅manual
  • sed "s:\\'string\\':replace:g"这次bash会将\\更改为\。但是,sed将再次获得\'。它将与前一个示例
  • 具有相同的效果

=>这就是为什么你需要一个额外的\来逃避特殊序列\'

  • sed "s:\\\\'string\\\\':replace:g"也可以使用bash会将\\\\更改为\\sed会收到\\'。特殊序列转义,就像你需要的那样

  • sed "s:\\\\\'string\\\\\':replace:g"哎哟,5个或更多反斜杠已经太多了

  • 但我真的想使用单引号:在这种情况下,您需要在任何要插入文字'的地方打破单引号:{{1} }

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed 's/\(\\'\''\)string\1/quotedstring/' file
必须引用

\,即\\,并且必须将单引号公开给shell,然后引用'\'。为了减少错误的可能性,在初始字符串之后使用分组和反向引用进行进一步的实例。

N.B。如果sed调用是单引号,则必须首先用单引号关闭命令,然后在shell中引用,并将命令的其余部分括在单引号中,即sed 's/...'\''.../.../' file