Excluir texto de um arquivo usando expressões regulares

1

Eu tenho muito texto em um arquivo. Desejo excluir todo o texto entre os símbolos === e <!!!> . Por exemplo. Text ===some comments<!!!> lala ===aaa<!!!>" deve ser Text lala depois de executar o comando. Eu tentei sed -i -E "s/(===(.*)<!!!>)//" file , mas não funciona.

Editar:

Text ===

some commenkjghkb

ufjhbgdfxjhg


srtdfts

</!!!> 

lala ===aaa

</!!!>"'''

deve ser Text lala

    
por tmm 08.05.2015 / 12:07

2 respostas

3

Com expressões regulares perl, você pode fazer correspondências não-vorazes :

perl -pe 's/===.*?<!!!>//g' file

Editar 1: Se você deseja inserir algum texto, use:

perl -pe 's/===.*?<!!!>/Text you want to insert/g' file

Editar 2: Se tiver que lidar com comentários de várias linhas, use também:

perl -pe 'BEGIN{undef $/;} s|===.*?</!!!>|insert|gs' file

Precisamos usar o modificador s , que traz . para corresponder também a uma nova linha. A variável $/ de perl, que é o separador de entrada, deve ser alterada para undef. Isso também é chamado de modo "slurp".

    
por 08.05.2015 / 12:18
1

Com sed que não suporta% não-ganancioso*, você precisará usar truques como:

sed 's/_/_u/g;s/|/_p/g;s/<!!!>/|/g
     s/===[^|]*|//g
     s/|/<!!!>/g;s/_p/|/g;s/_u/_/g'

Ou com algumas implementações sed :

sed 's/<!!!>/\
/g; s/===[^\n]*\n//g; s/\n/<!!!>/g'

Para suportar multi-line matching (conforme sua edição), com versões recentes do GNU sed, você pode usar o primeiro com a opção -z (assumindo que o arquivo não contenha caracteres NUL) ou usar algo como:

sed ':1
     $!{
       N
       b1
     }
     s/_/_u/g;s/|/_p/g;s/<!!!>/|/g
     s/===[^|]*|//g
     s/|/<!!!>/g;s/_p/|/g;s/_u/_/g'
    
por 08.05.2015 / 12:31