Bash sed中的引号和反斜杠

Bash sed中的引号和反斜杠,bash,sed,escaping,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' 您的示例中存在的问题: sed's:

我想用sed替换一个字符串,如下所示:

\'string\'
包括
\
'
在内。我想替换为,假设quotedstring,但尝试了许多使用转义的方法都没有成功。不起作用的示例:

  • sed“s:\'string\':quotedstring:g”
  • sed“s:\\'string\\':quotedstring:g”
  • sed's:\\'string\\\':quotedstring:g'
  • sed's:\\'string\\':quotedstring:g'

您的示例中存在的问题:

  • sed's:foo:bar:g'
    不能在单引号内使用单引号
    '
  • sed“s:\'string\':替换:g“
    如果反斜杠后面的字符在双引号
    中没有特殊意义,
    bash
    将不会删除它。因此,
    sed
    将真正接收
    \
    sed
    中的特殊序列,请参阅
  • sed“s:\\'string\\”:替换:g“
    这次
    bash
    \
    更改为
    \
    。但是,
    sed
    将再次获得
    \'
    。其效果与前面的示例相同
=>这就是为什么您需要一个额外的
\
,以转义特殊序列
\'


  • sed“s:\\\\\\'string\\\\':replace:g“
    这个也会工作
    bash
    会将
    \\\\\\\
    更改为
    \\
    ,并且
    sed
    会收到
    \\\\\'
    。特殊的转义序列,就像您需要的那样

  • sed“s:\\\'string\\\\\:替换:g”
    哎哟,5个或更多的反斜杠已经太多了

  • 但是我真的想使用单引号:在这种情况下,你需要在任何你想插入文字的地方打断单引号。:
    sed's:\\\'\'\'\'''string\\''''''':replace:g'

这可能适合您(GNU-sed):

\
必须被引用,即
\
,单引号必须暴露在shell中,然后被引用,即
'
\
。要减少错误的可能性,请在后续实例中,在初始字符串后使用分组和反向引用


注意:如果sed调用是单引号的,那么命令必须首先用单引号结束,然后在shell中引用,命令的其余部分用单引号括起来,即
sed的/…'\'\'''./…/'文件

您能给我们展示一些这样的文本的真实示例吗?您最后的尝试可以修改为
sed的:\\\x27string\\\\\x27:quotedstring:g'
。但这需要一个理解十六进制转义的sed版本。尽管如此,我的答案中已经包括了这一点(在单引号中使用
”)@PesaThe抱歉,我猜我是在你修改答案时开始回答的。我已经改进了我的答案,以便增加价值。一点也不担心!:)我我只是想避免重复回答。我喜欢你的新方法。
sed "s/\\\'string\\\'/replace/"
sed 's/\(\\'\''\)string\1/quotedstring/' file