文本处理三剑客之 Sed ——高级编辑命令
本篇介绍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 ——高级编辑命令的更多相关文章
- 文本处理三剑客之 Sed ——一般编辑命令
sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...
- 文本处理三剑客之sed命令
第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...
- 文本处理三剑客之sed
sed 1.简介 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(patternspace),接着用sed命令处理缓冲区中的内 ...
- Linux文本处理三剑客之sed
推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...
- 文本处理三剑客之 sed详解
1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...
- 文本处理三剑客之 sed
sed:文本流编辑器 主要是对文件的快速增删改查,查询功能中最常用的是过滤,取行 sed [选项] [sed内置命令字符] [输入文件] Options: -n:取消默认的sed输出,常与sed内置命 ...
- sed 流编辑命令
1.命令功能 sed非交互式的流编辑器,sed不会修改源文件内容,除非重定向来保存输出结果:默认情况下所有的输出行都将被打印到屏幕上. 2.语法格式 sed [option] {script-on ...
- 4.shell编程-文本处理三剑客之sed
4.1.sed的选项 sed,流编辑器.对标准输出或文件进行逐行处理. 语法格式 第一种:stdout | sed [option] "pattern command" 第二种:s ...
- linux下文本三剑客之sed
继上一篇对正则表达式以及linux三剑客grep的讲解后,这一篇对sed重点介绍. 一.sed简介 sed表示流编辑器(Stream Editor).这是一个简单但功能强大的工具,分析文本,并无缝 ...
随机推荐
- JS模块加载系统设计V1
一.require模块 +function() { var path = location.protocol + "//" + location.host +"/Java ...
- linux下对应mysql数据库的常用操作
ssh管理工具连接mysql数据库. 一.连接mysql数据库: 通过shh管理工具,登录linux的用户名,密码,进入ssh的命令行界面后,执行如下命令: mysql -u 数据库用户名 -p 然后 ...
- hibernate抓取问题
当使用xml配置类之间的关系时 ,例如 学生 班级,多对一关系 /** * 默认情况会发出2条SQL语句,一条取student,一条取Classroom,其实这只需要一条sql ...
- 【Lua】遍历目录结果输出到页面中,刷新页面后出现500 Internal Server Error
在通过lua获取目录json字符串,然后作为数据源,通过Extjs生成树的过程中,发生了一个奇怪的问题,那就是获取目录json字符串然后传递给Extjs生成树的这个过程中,一开始都是很顺利的就生成了, ...
- Notepad++如何删除空行和空白字符
Notepad++如何删除空行和空白字符 1.Notepad++编辑器在编辑选项里面包括很多功能,编辑->行操作->移除空行(包括空白字符). 2.Notepad++查找替换支持正则替换. ...
- grep常用命令总结与基础正则
grep 'str'用来选取含有str的行 参数: -v 反向选取 -n 显示行号 -c 计算查找到字符串的次数 -i 选取时不区分大小写 基础正则表达式符: [list] 从字符集合里选出任意一个字 ...
- Codeforces 981F. Round Marriage
Description 一个长度为 \(L\) 的环上有 \(n\) 个黑点和 \(n\) 个白点 , 你需要把黑点和白点配对 , 使得配对点的最大距离最小 , 最小距离定义为两点在环上的两条路径的最 ...
- 公司管理系列--Facebook是如何营造企业文化的[转]
本文讲下硅谷创业公司的文化,去过硅谷公司或者是看过硅谷公司报道的人,都会惊讶硅谷创业公司里面有如此奇特且活力十足的文化.在中国,企业文化是一个被滥用但是却又缺乏解读的概念,很多国内企业对保持公司的 ...
- grunt-contrib-cssmin使用指南
原文:http://riny.net/2014/grunt-cssmin/ grunt-contrib-cssmin v0.7.0 使用cssmin压缩css文件 Getting Started 这个 ...
- Timer 控件
1. 设置属性 Enable = true 或调用 start方法后, *_Tick 方法不会立即执行,会先等待一个时间间隔 2.timer1不管你上次的事情是否做完,它都会每个一个时间间隔做它应该 ...