sed
sed:Stream EDitor,行编辑器
sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,
称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,
把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没
有改变,除非你使用重定向存储输出。
sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
选项:
-n:不输出模式空间中的内容至屏幕;理解为仅显示处理过的结果,禁用默认输出
-e:多点编辑
-f /path/to/script_file:从指定文件中读取编辑脚本
-r:支持使用正则表达式
-i:直接编辑原文件
sed使用格式为地址命令
地址定界:
-
不给定任何地址或空地址,对全文进行处理
-
单地址;
#:指定地#行
pattern:被此模式模式所匹配的每一行
3.地址范围:
#,#:起始行到结束行
#,+#:例如3,+8==>从第3行开始,向下8行,包含第3行,共计9行
#,/pattern/:从第#行开始,到第一次能够被模式匹配的行结束
/pattern1/,/pattern2/:从第一次能够被模式1匹配的行开始,到第一个能够被模式2所匹配的行结束
/是固定的模式符号,必须要带
4.~:步进
1~2奇数行
2~2:偶数行
编辑命令:
d:删除模式空间匹配的行
p:显示模式空间中的内容
a\text:在行后面追加文本text;支持使用\n实现多行追加
i\text:在行前面插入文件text;支持使用\n实现多行插入
c\text:替换为点行或多行文本
w /path/to/somefile:保存模式匹配的行至指定文件
r /path/form/somefile :读取指定文件的文本至模式空间匹配的行后
=:为模式空间中的行打印行号
!:模式空间中匹配行取反处理,条件取反, (取反!要放在命令之前)例如“!d”
地址定界!编辑命令==>!位置
命令应用实例操作
[root@localhost ~]# cat test 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# sed '1,5d' test 6 7 ===>1,5为地址表示从第一行到第五行,d命令是删除匹配的行 8 所以,结果是只显示文件的6到10行 9 10 [root@localhost ~]#
[root@localhost ~]# sed '1,5p' test 1 1 ===>因为模式空间中的内容默认会显示,p命令显示模式空间匹配的内容 2 模式空间匹配的是1至5行,默认会显示1至10行,所以最终显示如下结果 3 3 4 4 5 5 6 7 8 9 10 [root@localhost ~]# sed -n '1,5p' test 1 2 ===>-n选项不输出模式空间中的内容至屏幕,相当于禁用了默认显示的功能, 3 所以只显示了p命令匹配的1至5行 4 5 [root@localhost ~]#
[root@localhost ~]# sed '1 a\newline' file ==>在第一行后面追加文本newline 1 newline 2 3 4 5 [root@localhost ~]# sed '1 i\newline' file ==>在第一行前面插入文本newline newline 1 2 3 4 5 [root@localhost ~]# sed '1 c\newline' file ==>第一行替换为文本newline 2 3 4 5
[root@localhost ~]# sed '2,4 w a' file ==>将第二行到第四行的内容保存至a文件中 1 2 3 4 5 [root@localhost ~]# cat a ==>a文件内容为file文件第二到第四行 2 3 4 [root@localhost ~]# sed '2r A' file ==>将A文件内容读取至第二行后面 1 2 ahhahahah 3 4 5 [root@localhost ~]# cat A ahhahahah
sed工具
s///:查找替换,支持使用其他分隔符,s@@@,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /path/to/somefile:将替换的行保存至文件中
看下sed实例
1.sed ‘2p’ /etc/passwd
第二行显示两边,其他行默认显示,太长了就没全显示出来了
2.sed –n ‘2p’ /etc/passwd
因为-n选项禁用了模式空间默认输出至屏幕的功能,所以只显示了第二行
3.sed –n ‘1,4p’ /etc/passwd
和上面以上,所以只显示1至4行
4.sed –n ‘/root/p’ /etc/passwd
只显示包含root的行;
5.sed –n ‘2,/root/p’ /etc/passwd 从2 行开始
显示从第二行开始,到第一个匹配到root的行结束之间的行
备注:/root/要从第二行后开始匹配
6.sed -n ‘/^$/=’ file 显示空行行号
7.sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
仅显示空行和其行号
8.sed ‘/root/a\superman’ /etc/passwd 行后
在能够匹配到root的行后面追加superman
9.sed ‘/root/i\superman’ /etc/passwd 行前
在能够匹配到root的行前插入Superman
10.sed ‘/root/c\superman’ /etc/passwd
把能够匹配到root的替换成superman
11.sed ‘/^$/d’ file
删除空行
12.sed ‘1,10d’ file
删除1到10行,因为总共才7行,删光了还不够,所以上面都不显示
13.nl /etc/passwd | sed ‘2,5d’
删除了第2到5行
14.nl /etc/passwd | sed ‘2a\tea’
在第二行后面追加tea
15.sed 's/test/mytest/g' example
将test替换成mytest,g表示全局替换
16.sed –n‘s/root/&superman/p’ /etc/passwd 单词后
将root替换成rootsuperman,并只显示匹配到root的行
备注:&代表前面匹配到的root
17.sed –n‘s/root/superman&/p’ /etc/passwd 单词前
将root替换成supermanroot,并只显示匹配到root的行
备注:&代表前面匹配到的root
18.sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
将dog替换成cat,将hi替换成lo,因为-e选项是可以多点编辑的,意思是可以同时编辑多个
19.sed –i.bak ‘s/dog/cat/g’ pets
-加上i选项会修改原文件,安全起见,备份原文件为pets.bak
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖至模式空间
N:追加匹配到的行的下一行至模式空间
d:删除模式空间中的行
D :删除 当前模式空间开端至\n 的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
还是看看实例好了
-
sed -n 'n;p' FILE
显示偶数行
理解:读取第一行时,第二行覆盖至模式空间,并显示,然后读取第三行,
下一行第四行覆盖至模式空间,并显示,如此类推
2. sed '1!G;h;$!d' FILE
逆序显示===>所有的命令都是针对模式空间
说明:读取第一行时,1命令不处理,将第一行内容覆盖至保存空间,将模式空间中的第一行删除
读取第二行时,将保存空间的内容追加至模式空间,此时模式空间里面有第二行第一行,
然后将此时模式空间的内容覆盖至保存空间,然后删掉模式空间的第二一行
读取第三行时,将保存空间的内容追加至模式空间,此时模式空间里面有第三行第二行第一行,
然后此时模式空间的内容覆盖至保存空间,然后删掉模式空间的第三二一行
读取第四(最后)行时,将保存空间的内容追加至模式空间,此时模式空间里面有第四行第三行第二行第一行,
然后此时模式空间的内容覆盖至保存空间,最后一个命令不处理,模式空间显示内容为第四三二一行
3. sed '$!N;$!D' FILE
显示倒数两行
说明:
读取第一行时,将第二行追加至模式空间,然后删除
读取第三行时,将第四行追加至模式空间,然后删除
读取第五行时,将第六(最后)行追加至模式空间,然后显示
4.sed '$!d' FILE
显示最后一行
说明:
读取第一行时,删除
读取第二行时,删除
读取第三行时,删除
读取第四行时,删除
读取第五行时,删除
读取第六(最后)行时,显示
5. sed ‘G’ FILE
在每一行后面追加空行
说明:
读取第一行时,将保持空间中的空行追加至模式空间,然后显示
读取第二行时,将保持空间中的空行追加至模式空间,然后显示
读取第三行时,将保持空间中的空行追加至模式空间,然后显示
读取第四行时,将保持空间中的空行追加至模式空间,然后显示
读取第五行时,将保持空间中的空行追加至模式空间,然后显示
读取第六行时,将保持空间中的空行追加至模式空间,然后显示
6.sed ‘g’ FILE
将每一行替换成空行
说明:
读取第一行时,将保持空间中的空行覆盖至模式空间,然后显示
读取第二行时,将保持空间中的空行覆盖至模式空间,然后显示
读取第三行时,将保持空间中的空行覆盖至模式空间,然后显示
读取第四行时,将保持空间中的空行覆盖至模式空间,然后显示
读取第五行时,将保持空间中的空行覆盖至模式空间,然后显示
读取第六行时,将保持空间中的空行覆盖至模式空间,然后显示
7. sed ‘/^$/d;G’ FILE
没搞明白,待研究
8.sed 'n;d' FILE
显示奇数行
说明:
读取第一行时,第二行覆盖至模式空间,然后删除
读取第三行时,第四行覆盖至模式空间,然后删除
读取第五行时,第六行覆盖至模式空间,然后删除
9.sed -n '1!G;h;$p' FILE
逆序显示
说明:
读取第一行时,1命令不处理,将第一行内容覆盖至保存空间,将模式空间中的第一行不显示
读取第二行时,将保存空间的内容追加至模式空间,此时模式空间里面有第二行第一行,
然后将此时模式空间的内容覆盖至保存空间,然后模式空间的第二一行不显示
读取第三行时,将保存空间的内容追加至模式空间,此时模式空间里面有第三行第二行第一行,
然后此时模式空间的内容覆盖至保存空间,然后模式空间的第三二一行不显示
读取第四(最后)行时,将保存空间的内容追加至模式空间,此时模式空间里面有第四行第三行第二行第一行,
然后此时模式空间的内容覆盖至保存空间,最后一行,模式空间显示内容为第四三二一行
原创文章,作者:qiuwei,如若转载,请注明出处:http://www.178linux.com/32090