本篇介绍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. Oracle 锁机制

    本文参考自:ORACLE锁机制 1.oracle是一个多用户使用的共享资源,当多个用户并发的操作同一数据行时,那么在oracle数据库中就会存在多个事务操作统一数据行的操作,如果不对并发操作进行控制, ...

  2. Git学习系列之Git 的优势有哪些?

    Git 的优势主要有: 1.更方便的 Merge 分布式管理必然导致大量的 Branch 和 Merge 操作.因此分布式版本控制系统都特别注意这方面.在传统的 CVS 里面制作 Branch 和 M ...

  3. ztree树样式的设计

    ztree的功能虽然很是强大,但是唯一有一点就是样式有点普通,所以如果我们需要修改样式,那么就只能进行样式重新覆盖了 样式代码,这些都是根据实际样式进行覆盖 /** * tree的选中样式 */ .c ...

  4. ant如何编译项目

    Ant的概念 可能有些读者并不理解什么是Ant以及如何使用它,但只要使用通过Linux系统的读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令其实 ...

  5. Node.js Mongoose数据库连接失败 提示:Authentication failed

    mongoose.connect('mongodb://username:password@127.0.0.1:27017/qianxunkefu_db')换成mongoose.connect('mo ...

  6. document.referrer的使用和window.opener 跟 window.parent 的区别

    偶尔看到了document.referrer,之前一直有点疑惑与window.opener 和 window.parent之间的区别 首先查了一下w3cSCHOOL, 上面的解释:referrer 属 ...

  7. Orcale 之基本术语一

    数据字典 数据字典是 Orcale 的重要组成部分.它有一系列的拥有数据库元数据信息的数据字典表和用户可以读取的数据字典视图组成,存放着数据库的有关信息.因此数据字典可以看作一组表和试图的集合.它们存 ...

  8. (C++学习)关于CString的一些疑问

    #include <iostream> #include <string> #include <afx.h> #include <vector> usi ...

  9. 游标的小知识(转载and整理)

    一.游标(用来存储多条查询数据的一种数据结构(结果集),它有一个指针,用来从上往下移动,从而达到遍历每条记录的作用) 游标也可以理解为逐行返回SQL语句的结果集 如何编写一个游标? 1.声明游标 de ...

  10. dns-prefetch使用整理

    网站投放百度.谷歌联盟广告,百度分享.推荐等,由于不同的DNS请求,会增加了网页加载时间,用户等待时间过长会造成跳出率增高,对SEO有一定影响. DNS解析速度是造成页面延迟加载的最大的原因. DNS ...