文章目录
shell中最核心的三个命令grep、sed、awk。
其中,
grep:文本搜索。
sed:文本处理。
awk:文本分析工具、语言。
本文主要讲述sed命令的用法
1.初识sed命令
1.1 sed命令是什么
sed是一种支持正则表达式的非交互式流编辑器。是脚本中修改文本或者文本替换的最佳工具。
1.2 sed工作原理
sed工作在内存,有两个空间:
- pattern space(模式空间):缓存空间,较多使用(模式空间里处理一行内容后,会将这一行内容删除。加载第2行内容);
- hold space(保留空间):临时仓库,很少使用。
工作原理:
sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理。sed在该行上执行完所有的命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间里删除,然后将下一行读入模式空间进行处理、显示。处理完文件的最后一行,sed便会结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明 -i 选项。
1.3 sed 命令怎么用
sed的常用语法命令格式:
sed [选项] sed编辑命令 输入文件
其他shell命令 | sed [选项] sed编辑命令
sed [选项] 输入文件
sed的常用选项:
- n:只显示匹配处理的行(否则会输出所有)
- e:执行多个编辑命令时(一般用;代替)
- i:直接在文件中进行修改,而不是输出到屏幕(此时不要接-n或-p命令,会导致源文件出问题)
- r:支持扩展正则表达式
- f:从脚本文件中读取内容并执行(文件中的编辑命令每行一个,不用;隔开)
sed的常用编辑命令:
- p:打印匹配行 print
- d:删除指定行 delete
- a:在匹配行后面追加 append
- i:在匹配行前面插入 insert
- c:整行替换
- r:将文件的内容读入 read
- w:将文本写入文件 write
- s:字符串替换(匹配正则表达式)substitution
sed里单引号和双引号的作用区别:
- 双引号里可以使用shell里的变量;单引号不能。
- 单引号和双引号里都可以存放模式。
1.4 示例
1.4.1 sed的n选项和编辑命令p的示例
PS:文件sed.txt只有17行数据,每行内容分别为1,2,3,4…17。
显示文件的第1、2行:
[root@liupeng lp]# sed -n '1,2p' sed.txt
1
2
[root@liupeng lp]#
或:
[root@liupeng lp]# sed -n '3,$!p' sed.txt -->即不显示从第3行到最后一行
1
2
[root@liupeng lp]#
显示文件的第2至5行:
[root@liupeng lp]# sed -n '2,5p' sed.txt
2
3
4
5
[root@liupeng lp]#
或:
[root@liupeng lp]# sed -n '2,+3p' sed.txt
2
3
4
5
[root@liupeng lp]#
显示文件的第10行:
[root@liupeng lp]# sed -n '10p' sed.txt
10
[root@liupeng lp]#
显示文件的最后一行:
[root@liupeng lp]# sed -n '$p' sed.txt
17
[root@liupeng lp]#
显示文件的1,3,5行:
[root@liupeng lp]# sed -n '1p;3p;5p' sed.txt -->注意此处变为了分号!
1
3
5
[root@liupeng lp]#
显示单数行:
[root@liupeng lp]# sed -n '1~2p' sed.txt --> ~表示步长
1
3
5
7
9
11
13
15
17
[root@liupeng lp]#
显示偶数行:
[root@liupeng lp]# sed -n '0~2p' sed.txt
2
4
6
8
10
12
14
16
[root@liupeng lp]#
加入模式:
这里的模式可以是正则表达式也可以是精确字符,
模式用/括起,扩展正则要加 -r选项。
sed -n '/模式/p’ 输入文件
显示包含2的行:
[root@liupeng lp]# sed -n '/2/p' sed.txt
2
12
[root@liupeng lp]#
不显示1开头的行:
[root@liupeng lp]# sed -rn '/^1/!p' sed.txt
2
3
4
5
6
7
8
9
[root@liupeng lp]#
显示以2为结尾的行:
[root@liupeng lp]# sed -n '/2$/p' sed.txt
2
12
[root@liupeng lp]#
显示以1和3开头的行:
[root@liupeng lp]# sed -n '/^[1,3]/p' sed.txt
1
3
10
11
12
13
14
15
16
17
[root@liupeng lp]#
1.4.2 sed的d编辑命令(不删除原文件内容)示例
删除操作可以根据行号和模式匹配进行操作。
删除1-15行:
[root@liupeng lp]# sed '1,15d' sed.txt
16
17
[root@liupeng lp]#
删除包含数字1的行:
[root@liupeng lp]# sed '/1/d' sed.txt
2
3
4
5
6
7
8
9
[root@liupeng lp]#
除了包含数字1的行都删除:
[root@liupeng lp]# sed '/1/!d' sed.txt
1
10
11
12
13
14
15
16
17
[root@liupeng lp]#
删除空行和注释:
[root@liupeng lp]# sed -r '/^$|^#/d' sed.txt -->^$指空行;^# 以#开头的行,即注释行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@liupeng lp]#
删除空行再删除注释行:
[root@liupeng lp]# sed -e '/^$/d' -e '/^#/d' sed.txt -->第二个-e用分号代替也可以
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@liupeng lp]#
1.4.3 sed的编辑命令之a追加命令示例
追加操作可以根据行号和模式匹配进行操作 (不更改原文件)。
新建一个sed2.txt文件,内容为数字1~7。
[root@liupeng lp]# cat sed2.txt
1
2
3
4
5
6
7