在sed中引用和反斜杠

问题描述 投票:2回答:2

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

\'string\'

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

  • sed "s:\'string\':quotedstring:g"
  • sed "s:\\'string\\':quotedstring:g"
  • sed 's:\\\'string\\\':quotedstring:g'
  • sed 's:\\'string\\':quotedstring:g'
bash sed escaping
2个回答
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" ouch,5个或更多反斜杠已经太多了
  • 但我真的想使用单引号:在这种情况下,你需要打破单引号,无论你想在哪里插入文字'sed 's:\\'\''string\\'\'':replace:g'

1
投票

这可能适合你(GNU sed):

sed 's/\(\\'\''\)string\1/quotedstring/' file

必须引用\,即\\和单引号必须暴露于外壳,然后引用即'\'。为了减少错误的可能性,在初始字符串之后使用分组和反向引用进一步实例化。

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

© www.soinside.com 2019 - 2024. All rights reserved.