escape de caractere especial usando sed não funciona

0

Eu sei que muitas perguntas foram escritas sobre isso, mas não funcionaram para mim. Estou trabalhando no bash e gostaria de substituir uma string por caracteres especiais com escape:

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

Obviamente, a saída estava incorreta. Você pode por favor me fornecer o comando correto sed ?

    
por Soumali Chatterjee 25.07.2017 / 09:45

1 resposta

2

Sua expressão regular está errada. Parece que você está tentando usar \( \) para definir uma classe de caracteres. Você não pode. Esses são grupos de captura, eles permitem que você se refira ao que foi correspondido dentro deles como (ou , para grupos subseqüentes). Uma classe de caracteres é definida usando [] . O que você quer fazer é capturar qualquer correspondência da classe de caracteres para substituí-la por ela mesma:

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

Note que você também precisa do ] para ser o primeiro caractere na classe de caractere. Caso contrário, é assumido como sendo o colchete de fechamento. E você não precisa escapar de . ou $ quando eles estão dentro de uma classe de caracteres.

Finalmente, você poderia fazer esse tipo de coisa mais simplesmente usando quotemeta :

do perl
$ 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\\.class\,
    
por terdon 25.07.2017 / 10:06