案例

sed 的高级替换

$cat file1
why:1
why:2
3
4
5
why:6
why:7
8
why:9 $cat file2
why:1
why:2 3 4 5
why:6
why:7 8
why:9

解决方法

sed ':1;N;/\nwhy/!s/\n/ /;t1;P;D' file
sed ':1;N;/\n.*:/!s/\n/ /;t1;P;D' file

解释

sed以行为单位处理文本,其模式缓冲区内只保留一行内容待处理。
:t 定义label "t",标签。相当于C语言里面的goto语句 b label ,无条件跳转到标签label;
如果label没有指定,跳转到命令的结尾
t标签触发的条件是:
必须t标签前的s///命令执行成功,否则忽略t标签 N 命令,将下一行读入并附加到当前行后面,
以\n(换行符)分隔,一起存在模式缓冲区内。
s/\n/ / 这是sed中的替换命令,将\n替换为空格
\n 就表示换行符
/\n.*:/!s/\n/ / 匹配到\n.*:内容时,不执行替换;否则将\n换成空格 P打印当前模式空间开端至\n的内容,并追加到默认输出之前。
N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,
但是两行之间依然含有\n换行符,然后执行后续命令。
然后再读取新行,对新读取的内容重头执行sed。
此时,新读取的行会覆盖之前的行(之前的两行已经合并为一行)。
D删除模板块(缓冲区)的第一行。(并且回到sed命令的最开始)
$cat file1
why:1
why:2
3
4
5
why:6
why:7
8
why:9 sed ':1;N;/\n.*:/!s/\n/ /;t1;P;D' file

sed读取文件是否等于添加到模式空间

D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

sed默认读取"指针"指定的行并且执行完成命令后会清空模式空间;但D命令不会清空模式空间, 会重返命令行首再次执行命令

完整的执行过程如下:

模式空间内容 执行命令
why:1 sed读取文件第1行
why:1 :1标签(以下每次执行忽略)
why:1\nwhy:2 执行命令N
why:1\nwhy:2 执行命令/\n.*

最新文章

  1. [Scrapy] Mac安装Scrapy
  2. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
  3. Vue.js学习 Item14 – 过滤器与自定义过滤器
  4. IOS 提交审核,遇到Missing Push Notification Entitlement 问题。
  5. 17、Wi-Fi Direct
  6. 10秒视频转局部GIF动画
  7. 基数排序---Java实现+C++实现
  8. 解决 Oracle 11g 不能导出空表的问题
  9. Intellij Idea搭建java web项目(问题总结)
  10. SuperSocket入门(一)-Telnet服务器和客户端请求处理
  11. 机器学习数学|微积分梯度jensen不等式
  12. 动态求区间K大值(权值线段树)
  13. Eclipse配置类似sublime的黑色主题
  14. python中修改字符串的几种方法
  15. centos 网卡状态
  16. servlet(4)异常处理
  17. 关于mysql分组查询
  18. Golang微服务:万精油NATS在Micro中的应用
  19. 办公室的远程传文件 的命令三种方式linux
  20. Python 优雅获取本机 IP 方法【转】

热门文章

  1. 《JAVA程序设计与实例》记录与归纳--继承与多态
  2. Effective Java 第三版——21. 为后代设计接口
  3. SpringMVC连接MongoDB操作数据库
  4. bzoj 1415: [Noi2005]聪聪和可可
  5. Jungle Roads(kruskar)
  6. Codeforces__Raising Bacteria
  7. jquery1.8 在IE8 下面报错:对象不支持此属性或方法 return b.getAttribute("id")===a
  8. git常见操作
  9. 【JavaScript_轮播图】
  10. SpringMVC Hello(IDEA)