(转载)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 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

【批处理学习笔记】第十五课:语句结构(1)

    类似于C语言,批处理也有它的语句结构。批处理的语句结构主要有选择结构(if语句)、循环结构(for语句)等。   if语句(选择结构)     if语...

2709
来自专栏IT可乐

Java IO详解(四)------字符输入输出流

 File 类的介绍:https://cloud.tencent.com/developer/article/1012532 Java IO 流的分类介绍:ht...

23310
来自专栏飞雪无情的博客

Go语言 | Go 1.9 新特性 Type Alias详解

北京时间2017.08.25,Go1.9正式版发布了。Go1.9经历了2个beta,好几个月,终于定了,发布了正式版本。Go 1.9包含了很多改变,比如类型别名...

784
来自专栏测试开发架构之路

总结了一些指针易出错的常见问题(七)

  指针的其他重要内容 主要研究以下问题 指针的类型转换 访问硬件设备 别名和强别名 使用restrict关键字 线程(一是如何用指针在线程之间共享数据这个基本...

2476
来自专栏程序员互动联盟

【编程基础】你是否真的了解main()函数?

最近看到很多人、甚至市面上的一些书籍,都使用了void main() ,其实这是错误的。C/C++中从来没有定义过void main() 。C++之父 Bjar...

3196
来自专栏散尽浮华

Python介绍

Python概述 Python创始人是吉多.范罗苏姆。在1989年万圣节期间为打发时间而开发的。 目前Python在TIOBE排行榜第五位置 ? Python可...

18510
来自专栏程序员八阿哥

Python从入门到摔门(5):18式优雅你的Python

在cmd中输入jupyter notebook --generate-config,然后找到生成的配置文件jupyter_notebook_config.py,...

542
来自专栏大闲人柴毛毛

高质量编程的金玉良言——依赖倒转原则

生活中的例子: 电脑的品牌有很多,但电脑中的所有部件都有标准的接口,不同的厂家都是按照标准去生产各个部件,这些部件的内部实现不同,但接口都是一样的,这样的话,如...

2687
来自专栏蓝天

sed 命令+正则表达式

sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道文件。sed可以随意编辑...

812
来自专栏zhisheng

Lombok 看这篇就够了

前提 自从进公司实习后,项目代码中能用 Lombok 的都用了,毕竟这么好的轮子要充分利用好。也可以减少一些 get/set/toString 方法的编写,虽说...

3509

扫码关注云+社区