Como eu uso o sed para remover todos, exceto alguns sinais de pontuação, globalmente?

2

Como posso remover toda a pontuação de um arquivo usando sed, com exceção de certos caracteres? Especificamente, quero manter esses caracteres:

@-_$%

No momento, estou usando isso para remover toda a pontuação, mas não tenho certeza de como modificá-lo para manter esses caracteres:

cat input.txt | sed -e "s/[[:punct:]]\+//g" > output.txt

Como posso remover apenas uma pontuação específica? Como:

.!?,'/\"()[]^*
    
por jay 10.09.2017 / 21:56

3 respostas

1

sed abordagem:

Exemplo de conteúdo do arquivo:

.!?,'/\"()[]^* @-$%
.!?,'/\"()[]^* @ sdfsd %
as,,d//asd a?sd %%   --@_ _asdasdad$
sdfsdf %''%!% 2 + 2 = (?)
sed '/[[:punct:]]*/{ s/[^[:alnum:][:space:]@_$%-]//g}' file

A saída:

 @-$%
 @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2  2  
    
por 10.09.2017 / 22:23
1

Para remover apenas os caracteres:

.!?,'/\"()[]^*

Use uma classe de caracteres como esta:

[][.!?,'/\"()^*]

Observe que o caractere ] deve ser primeiro. Além disso, o ^ não pode ser o primeiro, pois isso significaria algo totalmente diferente. E a barra invertida escapou.

Agora, para realmente usar esta classe de caracteres, você tem que levá-lo para Sed. Uma maneira de fazer isso é colocar

s/[][.!?,'/\"()^*]\+//g

em um arquivo e chame-o com sed -f scriptfile input.txt .

Outra maneira (mais complicada) é usar aspas de shell:

sed -e 's/[][.!?,'\''/\"()^*]\+//g' input.txt

Para a outra parte da sua pergunta, não há como combinar todos os caracteres em uma classe de caracteres exceto certos caracteres listados.

Você pode, no entanto, corresponder a todos os caracteres de pontuação NÃO assim:

[^[:punct:]]
    
por 10.09.2017 / 22:13
1

Você pode fazer isso com muita facilidade usando perl6 :

perl6 -pe 's:g/<:punct-[-@_%]>+//' file
  • <:punct-[-@_%]> corresponderá a qualquer caractere de pontuação, exceto -@_% .
  • :g é a opção global (como s / foo / bar / g em perl5 ou sed)

Para permitir a comparação entre as respostas (e também porque sou preguiçoso), reutilizarei a entrada de amostra do @ RomanPerekhrest:

.!?,'/\"()[]^* @-$%
.!?,'/\"()[]^* @ sdfsd %
as,,d//asd a?sd %%   --@_ _asdasdad$
sdfsdf %''%!% 2 + 2 = (?)

Então, esta linha:

perl6 -pe 's:g/<:punct-[-@_%]+[^]>+//' file

Dá:

^ @-$%
^ @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2 + 2 = 

Observe que ela difere da resposta dada por @RomanPerekhrest. Se você considerar que ^ , = ou + também deve ser incluído, use a seguinte linha:

perl6 -pe 's:g/<:punct-[-@_%]+[^+=]>+//' file

A saída será a mesma:

 @-$%
 @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2  2  
    
por 11.09.2017 / 03:13