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

全文转载于: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 然后只替换第一个。

替换第N[3]个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个进行替换 » 转载请注明来源:刺客博客

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术随笔

[Error] Segmentation fault

3916
来自专栏大前端_Web

从前端模块化的概念来理解Webpack

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1383
来自专栏游戏杂谈

php的Snoopy类

获取请求网页里面的所有链接,直接使用fetchlinks就可以,获取所有文本信息使用fetchtext(其内部还是使用正则表达式在进行处理),还有其它较多的功能...

1093
来自专栏Scott_Mr 个人专栏

初识 Runtime

33510
来自专栏安恒网络空间安全讲武堂

bugkuctf_web_writeup(部分)--下

bugkuctf平台10个较简单的web题目writeup,适合新手入门,可以找来试试http://ctf.bugku.com/bbs 。 本地包含 题目描述:...

4543
来自专栏李蔚蓬的专栏

小结:greenDAO和LitePal的区别

1. greenDAO的version等数据库属性设置都是在对应的模型类里面完成的,以Java class的属性变量的形式存储;而LitePal是在另外的一个x...

2551
来自专栏jmeter高手高高手

JMeter(十)-正则表达式关联

jmeter中,接口自动化的关键在于参数关联。比如需要登录的接口,如何调用登录口令?一个增删改查的闭环,如何将接口参数上下传递?下面就以实际的例子来仔细说一说

1142
来自专栏有趣的Python

7-Java常用工具类-多线程

我们程序员边听音乐边写代码再挂着qq,这三个软件可以同时运行就是我们的进程在起作用。

903
来自专栏IMWeb前端团队

Node中没搞明白require和import,你会被坑的很惨

ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是Common...

2888
来自专栏对角另一面

lodash源码分析之List缓存

本文为读 lodash 源码的第七篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash

1958

扫码关注云+社区