我知道有很多关于它的问题,但对我来说都不起作用。我正在使用 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\,