sed:替换每一行中第一次出现的字符串

sed:替换每一行中第一次出现的字符串

假设我有一个这样的文件:

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"

... 仅替换文件中第一次出现的条目,而不是每一行。

非常感谢您的帮助。

答案1

如果要处理所有带有 的行INSERT INTO,请不要提供地址范围。如果只想替换字符串的第一次出现,请不要提供/g

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

答案2

你可以用以下方法实现它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>')

相关内容