sed: substitui a primeira ocorrência de uma string em cada linha

5

Imagine que eu tenha um arquivo como este:

INSERT INTO table VALUES('1','<p><em>The lazy fox jumps again</em></p>bunch of other html<p><em>Is the lazy fox crazy?</em></p>')
INSERT INTO table VALUES('2','<p><em>The lazy fox jumps again</em></p>bunch of other html<p><em>Is the lazy fox crazy?</em></p>')
INSERT INTO table VALUES('3','<p><em>The lazy fox jumps again</em></p>bunch of other html<p><em>Is the lazy fox crazy?</em></p>')

E desejo excluir apenas a primeira ocorrência de <p><em> e </em></p> , por isso acabo com algo assim:

INSERT INTO table VALUES('1','The lazy fox jumps againbunch of other html<p><em>Is the lazy fox crazy?</em></p>')
INSERT INTO table VALUES('2','The lazy fox jumps againbunch of other html<p><em>Is the lazy fox crazy?</em></p>')
INSERT INTO table VALUES('3','The lazy fox jumps againbunch of other html<p><em>Is the lazy fox crazy?</em></p>')

... como posso fazer isso com sed (ou perl)? A declaração ...:

sed "1,/INSERT INTO/s/<p><em>//g"

... só substitui a primeira ocorrência no arquivo, não em todas as linhas.

A ajuda é muito apreciada.

    
por Marit Hoen 17.09.2012 / 11:51

2 respostas

4

Se você quiser processar todas as linhas com INSERT INTO , não forneça intervalo de endereços. Se você deseja substituir apenas a primeira ocorrência de uma string, não forneça /g :

sed -e '/INSERT INTO/s/<p><em>//' -e '/INSERT INTO/s/<\/em><\/p>//' 
    
por 17.09.2012 / 11:54
0

Aqui está uma maneira de fazer isso com perl :

perl -pe 's:<p><em>(.*?)</em></p>:$1:' infile

O quantificador .*? não é voraz, portanto somente o primeiro par de tags será correspondido.

Saída:

INSERT INTO table VALUES('1','The lazy fox jumps againbunch of other html<p><em>Is the lazy fox crazy?</em></p>')
INSERT INTO table VALUES('2','The lazy fox jumps againbunch of other html<p><em>Is the lazy fox crazy?</em></p>')
INSERT INTO table VALUES('3','The lazy fox jumps againbunch of other html<p><em>Is the lazy fox crazy?</em></p>')
    
por 17.09.2012 / 13:09