![sed:替换每一行中第一次出现的字符串](https://linux22.com/image/1329923/sed%EF%BC%9A%E6%9B%BF%E6%8D%A2%E6%AF%8F%E4%B8%80%E8%A1%8C%E4%B8%AD%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%87%BA%E7%8E%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
假设我有一个这样的文件:
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>')