使用 sed 转义特殊字符不起作用

使用 sed 转义特殊字符不起作用

我知道有很多关于它的问题,但对我来说都不起作用。我正在使用 bash,想用转义的特殊字符替换字符串:

echo "abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class," | sed -e "s#\([]*^+\.\$[-]\)##g"

显然输出不正确。您能给我提供正确的sed命令吗?

答案1

您的正则表达式是错误的。您似乎正在尝试使用\( \)来定义字符类。您不能。这些是捕获组,它们允许您引用其中匹配的内容\1(或\2\3对于后续组)。字符类是使用 定义的[]。您想要做的是捕获字符类的任何匹配项,并将其替换为转义后的自身:

$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' |
    sed -e 's#\([]*^+.$[/]\)#\\\1#g'

请注意,您还需要将设为字符类中的第一个字符。否则,它将被假定为右括号。当它们位于字符类中时,]您无需转义.或。$

最后,你可以使用 perl 的方法来更简单地完成这类事情quotemeta

$ echo 'abm1c/def/sdfd/sync/sdff.jar/rtets.jar/fg/gdf/ggdg/dg/adg/TextParser$2.class,' | 
    perl -lne 'print quotemeta()'
abm1c\/def\/sdfd\/sync\/sdff\.jar\/rtets\.jar\/fg\/gdf\/ggdg\/dg\/adg\/TextParser\$2\.class\,

相关内容