5

Представьте, что у меня есть файл вроде этого:

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>')

И я хочу удалить только первое вхождение <p><em> и </em></p> поэтому я получаю что-то вроде этого:

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>')

... как я могу сделать это с помощью sed (или perl)? Заявление...:

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

... заменяет только первое вхождение в файле, а не в каждой строке.

Помощь очень ценится.

2 ответа2

4

Если вы хотите обработать все строки с помощью INSERT INTO , не указывайте диапазон адресов. Если вы хотите заменить только первое вхождение строки, не указывайте /g:

sed -e '/INSERT INTO/s/<p><em>//' -e '/INSERT INTO/s/<\/em><\/p>//' 
0

Вот один из способов сделать это с помощью perl:

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

.*? квантификатор не жадный, поэтому будет сопоставлена только первая пара тегов.

Выход:

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>')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .