shell命令三剑客之sed命令详解

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
[root@liupeng lp
  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯言甚善

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值