我有一个我想用sed替换的字符串,完全是这样的:
\'string\'
包含\
和'
。我想替换为,假设 quotedstring ,但尝试了很多方法,但没有成功。无效的示例:
sed "s:\'string\':quotedstring:g"
sed "s:\\'string\\':quotedstring:g"
sed 's:\\\'string\\\':quotedstring:g'
sed 's:\\'string\\':quotedstring:g'
答案 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