案例

sed 的高级替换

  1. $cat file1
  2. why:1
  3. why:2
  4. 3
  5. 4
  6. 5
  7. why:6
  8. why:7
  9. 8
  10. why:9
  11. $cat file2
  12. why:1
  13. why:2 3 4 5
  14. why:6
  15. why:7 8
  16. why:9

解决方法

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

解释

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

sed进阶N;P;D的更多相关文章

  1. 第11章:sed进阶操作

    第11章:sed进阶操作 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为 ...

  2. 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶

    本章介绍一些sed编辑器提供的高级特性. 21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的. 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理 ...

  3. sed进阶教程

    寻址规则 常规寻址 如果没有指定地址,那么命令将应用于每一行. 如果只有一个地址,那么命令应用于与这个地址匹配的任意行. 如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址(不包括第一个地址 ...

  4. sed进阶

    下面这些命令未必经常会用到,但当需要时,知道这些肯定是件好事. 一.多行命令 sed命令通常是对一行数据进行处理,然后下一行重复处理. sed编辑器包含了三个可用来处理多行文本的特殊命令 N:将数据流 ...

  5. 文本处理工具——sed进阶

    一sed的搜索替代 (一)常见的和替代相关的选项 搜索替代,和vim的写法很像 s///:查找替换,支持使用其它分隔符,s@@@,s### p: 显示替换成功的行,就是打印. w /PATH/TO/S ...

  6. Shell编程—sed进阶

    1多行命令 sed编辑器包含了三个可用来处理多行文本的特殊命令. N:将数据流中的下一行加进来创建一个多行组来处理. D:删除多行组中的一行. P:打印多行组中的一行. 1.1next命令 1. 单行 ...

  7. sed命令总结-Linux

    sed命令总结-Linux linuxsed 2018年02月08日 19时27分57秒 命令语法经常忘记,每次总是看笔记不切实际,记不起来的要多查manual,本次总结按照manual总结,希望下次 ...

  8. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

  9. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

随机推荐

  1. 开源API测试工具 Hitchhiker v0.8 - 自动化测试结果统计

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持自动化测试, 数据对比,压力测试,支持脚本定制请求,可以轻松部署到本地,和你的team成员一起协作测试Api. ...

  2. php中的echo,json_decode,json_encode常用函数使用注意事项

    ---恢复内容开始--- 1.echo函数 echo只能输出单个字符串或者整数,不能直接输出数组.要输出多个字符串必须用分号 eg: echo可以输出字符串加变量,如果输出的数字字符串则会将对应的数字 ...

  3. 【批处理学习笔记】第二十九课:ASCII码

    前面的例子中,我们已经使用过一次ASCII码了,也就是那个笑脸.ASCII码是图形化的符号,可以用来点缀我们的批处理的.    在cmd窗口中我们可以通过任意一个字符的ASCII码来输入该字符,比如C ...

  4. set排序(个人模版)

    set排序: #include<stdio.h> #include<string.h> #include<iostream> #include<set> ...

  5. [bzoj2638] 黑白染色

    比较蛋疼的是我们可以先染个底色,再在底色上染别的东西. 由ccz大爷的题解可得..将目标状态里相同颜色的联通块缩点后,枚举起点,生成树里的最大节点深度就是需要的次数了, 如果最大深度是白色的话记得-1 ...

  6. [bzoj1500 维修数列](NOI2005) (splay)

    真的是太弱了TAT...光是把代码码出来就花了3h..还调了快1h才弄完T_T 号称考你会不会splay(当然通过条件是1h内AC..吓傻)... 黄学长的题解:http://hzwer.com/28 ...

  7. hdu_1033(我怎么找到的这么水的题,只为保存代码。。。)

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...

  8. [20160711][在Windows下调用neven链接库]

    相关说明 这篇文档是接前篇[20160711][neven代码移植Windows]和[20160711][VS2012配置OpenCV2.4.9]下完成,首先需要通过篇文档编译出neven动态链接库和 ...

  9. js判断是否为ie浏览器

    之前在开发时遇到浏览器的兼容性问题,涉及到对ie浏览器的判断.现在此做个笔记. 这里我以函数的形式来判断,在用的时候直接调用即可. var isIE = !!window.ActiveXObject ...

  10. Spark算子--reduceByKey

    reduceByKey--Transformation类算子 代码示例 result