sed命令¶
欢迎阅读《每天一个Linux命令》系列 !在本篇文章中,将说明sed命令用法。
一、简介¶
sed
是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
二、语法¶
三、选项¶
选项 | 说明 |
---|---|
-n |
屏蔽默认输出,常与sed内置命令 p 一起用 |
-i |
将结果写入文件 |
-e |
多次编辑,不需要管道符 |
-r |
支持扩展正则 |
四、内置命令¶
内置命令 | 说明 |
---|---|
a |
append,对文本追加,在指定行后增加1或多行 |
d |
delete,删除匹配行 |
i |
insert,表示插入文本,在指定行前添加1或多行 |
p |
打印匹配行的内容,通过与 -n 一起用 |
s/正则/替换内容/g |
匹配正则内容,然后替换内容,结尾 g 代表全局匹配 |
五、匹配范围¶
匹配范围 | 说明 |
---|---|
空地址 | 全文处理 |
单地址 | 指定某一行 |
/pattern/ | 被模式匹配到的每一行 |
范围区间 | 1,2 :第1到2行;10,+5 :第10行向下5行;/pattern1/,/pattern2/ |
步长 | 1~2 :奇数行;2~2 :偶数行 |
六 、示例¶
1.基本操作¶
sed -n '1p' test.txt # 遍历文本,1p代表只看第1行
sed -n '1,2p' test.txt # 看1-2行
sed -n '2p;4p' test.txt # 输出第2、第4行
sed -n '1,+2p' test.txt # 输出1行,+后面的2行
sed -n '1~2p' test.txt # 输出第1行,后面的奇数行3 5 7 9...
sed -n '/^root/p' test.txt # 输出以root开头的行
sed -n '$=' test.txt # 显示最后一个行号
sed -n '=' test.txt # 只显示文件所有的行号
sed -n '$=' /etc/passwd # 查看主机所有账号数量
2.数据删除¶
3.数据替换¶
sed 's/qq/weixin/g' 1.txt # 替换文件中的 qq 为 weixin(加-i写入文件),或者使用重定向
sed '3s/2017/AAAA/2;3s/2017/AAAA/2' # 将第三行的第2、3个2017替换成AAAA
2017 2011 2018
2017 2017 2024
2017 AAAA AAAA
sed 's#/bin/bash#/sbin/nologin#' # 将/bin/bash替换成/sbin/nologin
4.文本内容追加¶
sed '2i i am 27' 1.txt # 在第二行上面追加 i am 27
sed -i '2a I am joshaaa' josh2 # 在第二行下追加 I am joshaaa
# 追加多行,在第三行下追加两行(\n),追加内容(i like linux. and you?)
sed -i "3a i like linux.\nand you?" josh2
sed "a----------" 1.txt # 在每行下都添加新内容
5.获取网卡地址¶
```bash
取出IP对应的行¶
[root@localhost /root]# ifconfig | sed -n '2p' inet 10.22.51.66 netmask 255.255.255.0 broadcast 10.22.51.255
找到第2行后,去掉IP之前的内容¶
[root@localhost /root]# ifconfig | sed -n '2s#^.*inet##gp' 10.22.51.66 netmask 255.255.255.0 broadcast 10.22.51.255
说明¶
-n:取消默认输出 2s:处理第2行内容 #^.*inet##:匹配inet前面所有内容 gp:代表全局替换且打印替换结果
找到第2行后并去掉IP之前的内容后,再去掉IP之后的内容¶
[root@localhost /root]# ifconfig | sed -n '2s#^.inet##gp' | sed -n 's/net.$//gp' 10.22.51.66
说明¶
net.*\(:匹配net到结尾的内容 s/net.*\)//gp:把匹配到内容替换为空
使用 -e 选项多次编辑¶
[root@localhost /root]# ifconfig | sed -ne '2s/^.inet//g' -e '2s/net.$//gp' 10.22.51.66