前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(转载)Linux之sed匹配第N个进行替换

(转载)Linux之sed匹配第N个进行替换

作者头像
刺_猬
发布2018-06-21 15:26:33
9K0
发布2018-06-21 15:26:33
举报
文章被收录于专栏:刺客博客

全文转载于:http://blog.uouo123.com/post/704.html

这篇文章对我收获巨大,对我对Linux脚本编写有更深层次的理解,恐怕这么好的东西被遗忘,特此全文搬运过来。

文本:

aa

88

bb

88

88

cc

88

88

替换第一个88为--:

sed '0,/88/s//--/' file

sed ':a;N;$!ba;s/88/--/' file

解析

这有两种方法,第一个是只匹配到第一个88为止,然后替换那个88为--。

第二个句子是通过循环把文本全部读进pattern space 然后只替换第一个。

替换第N3个88为--:

sed '/88/{x;s/^/./;/^.{3}$/{x;s/.*/--/;x};x;}' file

sed ':a;N;$!ba;s/88/--/3' file

解析

第一个命令叫打点记数法,因为sed没有 var++ 之类的操作来记数。

第二个命令和上面第一个其实是一样的原理,全部读入文本后统一替换第3个匹配的内容。

替换最后一个匹配的88为--:

sed ':a;/\n88/!{$s/88/--/;N;ba};P;D' file

sed ':a;N;$!ba;s/(.*)88/\1--/' file

解析

第一个命令,没匹配到 /\n88/ 的内容就读取下一行,然后 ba 跳转去开始处,如果读取到88的行呢,就执行后面的 P;D 组合,D也有循环功能,一直把匹配 \n88 内容的第一行打印,删除,直到不匹配/\n88/(因为换行符已经被打印出去了,所以不再会匹配到 \n88),这时候才继续往下读,如果又读到88的行,那么又执行P;D循环,同上操作。一直到匹配到最后一个88的行,继续读取到末行时执行替换,N 因为没有下一行可读,所以会自动中止命令,因为没有 -n 参数会打印 pattern space 里的内容到屏幕,所以就不会再执行后面的 ba 避免了死循环,这样的用法只存在于 GNU sed ,大家注意。所以这整个流程只会替换最后一个88。

第二个命令其实和上面的都一样,也是全部读进 pattern space 里,最后利用正则的贪婪替换掉最后一个88。

再次感谢原作者的无私奉献。

» 本文链接:(转载)Linux之sed匹配第N个进行替换

» 转载请注明来源:刺客博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档