本篇介绍sed的高级编辑命令

高级编辑命令

P:打印模式空间开端至\n内容,并追加到默认输出之前

n: 读取匹配到的行的下一行覆盖至模式空间

N:读取匹配到的行的下一行追加至模式空间

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

d: 删除模式空间中的行,并进入下一个循环

D: 删除当前模式空间开端至\n的内容,放弃之后的命令,之后对模式空间剩余内容重新执行前面的命令,如果模式空间没有\n,则与d相同(之后会有详细说明)

关于多行:

被追加了行的空间,里面的内容被sed看做是被\n隔开的行:

如:

模式空间原有的行\n被追加的行

p/P命令:

都用于打印模式空间内容,两者区别:

小写p打印当前模式空间内容,追加到默认输出之后

大写P打印当前模式空间开始至\n的内容,并追加到默认输出之前。

n命令:

读取下一行,覆盖模式空间的前一行,如果期间任何命令执行失败,则停止运行后续命令.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取出文件中的偶数行

$ sed -n 'n;p' text
2b
4d
6f
8h

解析:

读取第一行1a,执行n命令,此时模式空间为2b,执行p,打印模式空间内容2p

读取第三行3c,执行n命令,此时模式空间为4d,执行p,打印模式空间内容4d

读取第五行5e,执行n命令,此时模式空间为6f,执行p,打印模式空间内容6f

读取第七行7g,执行n命令,此时模式空间为8h,执行p,打印模式空间内容8h

读取第九行9i,执行n命令,由于没有下一行,n命令执行失败,所以直接退出,不执行后续p命令.

所以最后输出结果即为全部偶数行

N命令:

读取并将下一行追加到模式空间,但把两行看做是含有\n换行符的一行,如果期间任何命令执行失败,则停止运行后续命令.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取出文件中的奇数行

$ sed -n '$!N;P' text  # -n 不显示默认输出
1a
3c
5e
7g
9i

解析:

读取第一行1a,不是最后一行,$!条件成立,执行N,取出下一行内容2b追加到1a之后,此时模式空间为1a\n2b,执行P,仅输出\n前内容,即1a

读取第三行3c,不是最后一行,$!条件成立,执行N,取出下一行内容4d追加到3c之后,此时模式空间为3c\n4d,执行P,仅输出\n前内容,即3c

读取第五行5e,不是最后一行,$!条件成立,执行N,取出下一行内容6f追加到5e之后,此时模式空间为5e\n6f,执行P,仅输出\n前内容,即5e

读取第七行7g,不是最后一行,$!条件成立,执行N,取出下一行内容8h追加到7g之后,此时模式空间为7g\n8h,执行P,仅输出\n前内容,即7g

读取第九行9i,因为最后一行,$!条件不成立,跳过执行N,直接执行P,即输出9i.

所以最后输出结果为全部奇数行.

注意匹配失败也是命令执行成功的一种结果,并非命令执行失败.

d命令:

删除模式空间的所有内容,并直接进入下一个循环.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取出文件中的奇数行

$ sed 'n;d' text
1a
3c
5e
7g
9i

解析:

读取第一行1a,执行命令n,此时模式空间内容为2b,执行d,模式空间清空,最后默认输出为没有被处理过的1a

读取第三行3c,执行命令n,模式空间为4d,执行d,模式空间空,默认输出3c

第五行....5e

第七行....7g

第九行9i,由于没有下一行,n执行失败,终止后续命令.默认输出9i

所以最终输出结果为所有奇数行

D命令:

删除模式空间开始到第一个\n的所有内容,结束后续命令,并使用模式空间剩余内容进入下一轮循环.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取文件最后一行

$ sed 'N;D' text
9i

解析:

读取第一行1a,执行N,模式空间内容为1a\n2b,执行D,模式空间剩下2b.

返回执行N,取出第三行3c,模式空间为2b\n3c,执行D,模式空间为3c

......

返回执行N,取出第九行9i,模式空间为8h\n9i,执行D,模式空间为9i

返回执行N,没有下一行,执行失败,不执行后续命令,默认输出模式空间内容9i.

最终输出结果为最后一行

H/G/h/g命令:

大写的H/G都为追加操作

H为模式空间追加到保持空间

G为保持空间追加到模式空间

小写的h/g都是覆盖操作

h为模式空间覆盖保持空间

g为保持空间覆盖模式空间

示例:

$ sed 'G' text #文件每一行之后插入空行
1a 2b 3c 4d 5e 6f 7g 8h 9i

解析:

保持空间是空,所以G追加到模式空间也就是空行了.

$ sed 'g' text #结果为9个空行

解析:

保持空间是空,把模式空间每一行都覆盖为空.

$ sed '1!G;$!h;$!d' text #逆序显示文件的行
9i
8h
7g
6f
5e
4d
3c
2b
1a

解析:

读取第一行1a,1!条件不成立,跳过G,执行h,模式空间中的1a覆盖到保持空间,$!成立执行d,删除模式空间内容,进入下个循环

读取第二行2b,1!条件成立,执行G,模式空间变为2b\n1a,执行h,覆盖到保持空间,$!成立,执行d,删除模式空间内容,进入下个循环

读取第三行3c,1!条件成立,执行G,模式空间变为3c\n2b\n1a,执行h,覆盖到保持空间,$!成立,执行d,删除模式空间内容,进入下个循环

....

读取最后一行9i,1!条件成立,执行G,模式空间变为9i\n8h\n7g\n6f\n5e\n4d\n3c\n2b\n1a,$!成立,跳过h,跳过d,默认输出模式空间内容.9i\n8h\n7g\n6f\n5e\n4d\n3c\n2b\n1a

其他示例:

使用含有模式的文件,将文件中的小写字母转换成大写,并将每一行的字母与数字交换位置

文件text的内容为

1a

2b

3c

4d

5e

6f

7g

8h

9i

$ cat pat
h
y/abcdefghi/ABCDEFGHI/
s@([0-9])([A-Z])@\2\1@ $ sed -rf pat text # -r 使用扩展正则,-f 指定含有模式的文件
A1
B2
C3
D4
E5
F6
G7
H8
I9

解析

第一步读取一行执行h,放入保持空间.

第二步把所有小写字母换成大写

第三步通过替换命令把字母和数字位置调换

文本number.txt中内容如下

$ cat numbers.txt
1
2
3
4
5
6
7
8
9

将文本文件的n和n+1行合并为一行,n为奇数行

$ sed 'N;s@\n@ @g' number.txt
1 2
3 4
5 6
7 8
9

解析:

读取第一行1,放入模式空间,执行N,模式空间为1\n2,执行s替换\n为空格,结果为1 2,默认输出1 2

读取第三行3,放入模式空间,执行N,模式空间为3\n4,执行s替换\n为空格,结果为3 4,默认输出3 4

.....

读取第九行9,执行N失败,不执行后续命令,默认输出9

每两行为一组倒序排列

$ seq 1 8 | sed -n '$!N;2!G;h;$p'
7
8
5
6
3
4
1
2

解析:

seq 结果为

1

2

3

4

5

6

7

8

读取第一行,$!成立,执行N,读取第二行内容追加到模式空间,模式空间为1\n2,因为已经读取到第2行,所以2!不成立,跳过G,执行h,保持空间为1\n2,不是最后一行,$不成立,不执行p不输出到屏幕

读取第三行,$!成立,执行N,读取第四行内容追加到模式空间,模式空间为3\n4,2!成立,执行G,把保持空间的1\n2追加到模式空间,此时模式空间为3\n4\n1\n2,执行h,覆盖到保持空间,再次跳过p输出

.........

读取第七行,$!成立,执行N,读取第八行内容追加到模式空间,模式空间为7\n8,2!成立,执行G,把保持空间的5\n6\n3\n4\n1\n2到模式空间,此时模式空间为7\n8\n5\n6\n3\n4\n1\n2,执行h,覆盖到保持间,这一步是多于的,可以在h前加$!跳过此步,最后因为是最后一行$成立,p成功执行,打印模式空间内容

文本处理三剑客之 Sed ——高级编辑命令的更多相关文章

  1. 文本处理三剑客之 Sed ——一般编辑命令

    sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...

  2. 文本处理三剑客之sed命令

    第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...

  3. 文本处理三剑客之sed

    sed 1.简介 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(patternspace),接着用sed命令处理缓冲区中的内 ...

  4. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  5. 文本处理三剑客之 sed详解

    1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  6. 文本处理三剑客之 sed

    sed:文本流编辑器 主要是对文件的快速增删改查,查询功能中最常用的是过滤,取行 sed [选项] [sed内置命令字符] [输入文件] Options: -n:取消默认的sed输出,常与sed内置命 ...

  7. sed 流编辑命令

    1.命令功能 sed非交互式的流编辑器,sed不会修改源文件内容,除非重定向来保存输出结果:默认情况下所有的输出行都将被打印到屏幕上. 2.语法格式 sed  [option]  {script-on ...

  8. 4.shell编程-文本处理三剑客之sed

    4.1.sed的选项 sed,流编辑器.对标准输出或文件进行逐行处理. 语法格式 第一种:stdout | sed [option] "pattern command" 第二种:s ...

  9. linux下文本三剑客之sed

    继上一篇对正则表达式以及linux三剑客grep的讲解后,这一篇对sed重点介绍. 一.sed简介   sed表示流编辑器(Stream Editor).这是一个简单但功能强大的工具,分析文本,并无缝 ...

随机推荐

  1. JS模块加载系统设计V1

    一.require模块 +function() { var path = location.protocol + "//" + location.host +"/Java ...

  2. linux下对应mysql数据库的常用操作

    ssh管理工具连接mysql数据库. 一.连接mysql数据库: 通过shh管理工具,登录linux的用户名,密码,进入ssh的命令行界面后,执行如下命令: mysql -u 数据库用户名 -p 然后 ...

  3. hibernate抓取问题

    当使用xml配置类之间的关系时 ,例如 学生 班级,多对一关系 /** * 默认情况会发出2条SQL语句,一条取student,一条取Classroom,其实这只需要一条sql             ...

  4. 【Lua】遍历目录结果输出到页面中,刷新页面后出现500 Internal Server Error

    在通过lua获取目录json字符串,然后作为数据源,通过Extjs生成树的过程中,发生了一个奇怪的问题,那就是获取目录json字符串然后传递给Extjs生成树的这个过程中,一开始都是很顺利的就生成了, ...

  5. Notepad++如何删除空行和空白字符

    Notepad++如何删除空行和空白字符 1.Notepad++编辑器在编辑选项里面包括很多功能,编辑->行操作->移除空行(包括空白字符). 2.Notepad++查找替换支持正则替换. ...

  6. grep常用命令总结与基础正则

    grep 'str'用来选取含有str的行 参数: -v 反向选取 -n 显示行号 -c 计算查找到字符串的次数 -i 选取时不区分大小写 基础正则表达式符: [list] 从字符集合里选出任意一个字 ...

  7. Codeforces 981F. Round Marriage

    Description 一个长度为 \(L\) 的环上有 \(n\) 个黑点和 \(n\) 个白点 , 你需要把黑点和白点配对 , 使得配对点的最大距离最小 , 最小距离定义为两点在环上的两条路径的最 ...

  8. 公司管理系列--Facebook是如何营造企业文化的[转]

      本文讲下硅谷创业公司的文化,去过硅谷公司或者是看过硅谷公司报道的人,都会惊讶硅谷创业公司里面有如此奇特且活力十足的文化.在中国,企业文化是一个被滥用但是却又缺乏解读的概念,很多国内企业对保持公司的 ...

  9. grunt-contrib-cssmin使用指南

    原文:http://riny.net/2014/grunt-cssmin/ grunt-contrib-cssmin v0.7.0 使用cssmin压缩css文件 Getting Started 这个 ...

  10. Timer 控件

    1. 设置属性 Enable = true  或调用 start方法后, *_Tick 方法不会立即执行,会先等待一个时间间隔 2.timer1不管你上次的事情是否做完,它都会每个一个时间间隔做它应该 ...