我有一个字符串,我想用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/\\\'string\\\'/replace/"
您的示例存在问题:
sed 's:foo:bar:g'
你不能在单引号内使用单引号'
sed "s:\'string\':replace:g"
如果反斜杠后的字符在双引号"
中没有特殊含义,bash
将不会删除它。因此,sed
将真正收到\'
。 \'
是sed
中的特殊序列,请参阅manualsed "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'
这可能适合你(GNU sed):
sed 's/\(\\'\''\)string\1/quotedstring/' file
必须引用\
,即\\
和单引号必须暴露于外壳,然后引用即'
到\'
。为了减少错误的可能性,在初始字符串之后使用分组和反向引用进一步实例化。
注:如果sed调用是单引号,则必须首先用单引号关闭命令,然后在shell中引用,并将命令的其余部分括在单引号中,即sed 's/...'\''.../.../' file