本篇介绍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. MySQL 查询结果分组 group by

    [group by {col_name | position} [ASC | DESC ]] 分组条件 [HAVING where_condition] HAVING 后面的条件必须出现在select ...

  2. git学习笔记6

    打标签 git tag -m "Say bye-bye to all previous practice." old_practice //引号里是注释 本地删除不是真的删除,对暂 ...

  3. unity接入安卓sdk (unity调用安卓工程)

    1.安装jdk 并且配置环境,这个网上资料很多,这里不说了 2.安卓开发软件eclipse集成环境版 下载地址 http://tools.android-studio.org/index.php/ad ...

  4. Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

    Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...

  5. Centos 从零开始 (二)

    因为我是搞 nodejs的 所以以后会安装一些依赖于node的 比如mongodb数据库等. 6:安装nodejs 安装的时候遇到个小问题.yum install nodejs 报错 说没有这个包.然 ...

  6. golang学习之regexp

    regexp是golang标准库自带的正则校验包,使用: re, _ := regexp.Compile(`(\d+)年(\d+)月`) //判断是否匹配category类别搜索 ismatch := ...

  7. C#在不同平台下DLL的引用问题

    缘起 很多时候,我们需要引用在不同平台下的DLL,32位(X86)和64位(X64).如果平台错误,在C#中会引发BadImageFormatException异常. 解决思路 我们同时不能添加不同平 ...

  8. Python基础学习总结(六)

    8.函数 函数是带名字的代码块,用于完成具体的工作.def函数定义,指出函数名.定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参 ...

  9. Python基础学习总结(三)

    4.if语句 If语句可以检查判定当前条件,并执行相应措施. if a in A: if a 条件: 执行命令1 4 else: 执行命令2 if判断条件还可以简写 if x: print('True ...

  10. Oracle 数据库字典 sys.obj$ 表中关于type#的解释

    sys.obj$ 表是oracle 数据库字典表中的对象基础表,所有对象都在该表中有记录,其中type#字段表明对象类型,比如有一个表 test ,则该对象在sys.obj$ 中存在一条记录,name ...