Shell中sed的用法
sed是一款强大的流式文本处理工具,主要用于对文本进行查找、替换、删除、插入等操作。
常用命令
命令 | 说明 |
---|---|
s/old/new/ | 替换第一个匹配的字符串(old 替换为 new )。 |
s/old/new/g | 替换所有匹配的字符串(全局替换)。 |
p | 打印当前行。 |
d | 删除当前行。 |
a\text | 在指定行后追加文本。 |
i\text | 在指定行前插入文本。 |
c\text | 替换指定行的内容。 |
sed命令的常用选项如下:
-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)
-r(支持扩展正则)
-i(修改源文件)
条件可以是行号或者/正则/,没有条件时默认为所有行都执行指令,指令可以是p输出、d删除、s替换
使用sed
1)行号案例
[root@sv7 ~]# head -5 /etc/passwd > user #准备素材文件
[root@sv7 ~]# sed -n 'p' user #输出所有行
[root@sv7 ~]# sed -n '1p' user #输出第1行
[root@sv7 ~]# sed -n '2p' user #输出第2行
[root@sv7 ~]# sed -n '3p' user #输出第3行
[root@sv7 ~]# sed -n '2,4p' user #输出2~4行
[root@sv7 ~]# sed -n '2p;4p' user #输出第2行与第4行
[root@sv7 ~]# sed -n '3,+1p' user #输出第3行以及后面1行
[root@sv7 ~]# sed -n '1~2p' user #输出奇数行
[root@sv7 ~]# cat -n user | sed -n '1~2p' #输出奇数行,使用cat -n 打印行号;1~2p:起点为1,步长为2
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@sv7 ~]# cat -n user | sed -n '2~2p' #输出偶数行,2~2p:起点为2,步长为2
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
2)使用正则当条件
[root@sv7 ~]# sed -n '/^root/p' user #输出以root开头的行
[root@sv7 ~]# sed -n '/root/p' user #输出包含root的行
[root@sv7 ~]# sed -n '/bash$/p' user #输出bash结尾的行
[root@sv7 ~]# sed -nr '/^root|^bin/p' user #输出以root开头的行或bin开头的行,|是扩展正则,需要r选项
3)特殊用法
[root@sv7 ~]# sed -n '1!p' user #输出除了第1行的内容,!是取反
[root@sv7 ~]# sed -n '$p' user #输出最后一行
[root@sv7 ~]# sed -n '=' user #输出行号,如果是$=就是最后一行的行号
以上操作,如果去掉-n,再将p指令改成d指令就是删除
步骤三:sed工具的p、d、s操作指令案例集合
1)p指令案例集锦
[root@sv7 ~]# sed -n 'p' user #输出所有行,等同于cat user
[root@sv7 ~]# sed -n '4p' user #输出第4行
[root@sv7 ~]# sed -n '4,7p' user #输出第4~7行
[root@sv7 ~]# sed -n '/^bin/p' user #输出以bin开头的行
[root@sv7 ~]# sed -n '$=' user #输出文件的行数
2)d指令案例集锦
[root@sv7 ~]# sed '3,5d' user #删除第3~5行
[root@sv7 ~]# sed '/root/d' user #删除所有包含root的行
[root@sv7 ~]# sed '/root/!d' user #删除不包含root的行,!符号表示取反
[root@sv7 ~]# sed '/^dae/d' user #删除以dae开头的行
[root@sv7 ~]# sed '$d' user #删除文件的最后一行
[root@sv7 ~]# sed '/^$/d' user #删除所有空行
3)sed命令的s替换基本功能(s/旧内容/新内容/选项(选项可选)):
[root@sv7 ~]# vim shu.txt #新建素材
2017 2011 2018
2017 2017 2024
2017 2017 2017
[root@sv7 ~]# sed 's/2017/6666/' shu.txt #把所有行的第1个2017替换成6666
[root@sv7 ~]# sed 's/2017/6666/g' shu.txt #所有行的所有2017都替换成6666
[root@sv7 ~]# sed '2s/2017/6666/g' shu.txt #第2行的所有2017都替换成6666
[root@sv7 ~]# sed 's/2017/6666/2' shu.txt #把所有行的第2个2017替换成6666
[root@sv7 ~]# sed '1s/2017/6666/' shu.txt #把第1行的第1个2017替换成6666
[root@sv7 ~]# sed '3s/2017/6666/3' shu.txt #把第3行的第3个2017替换成6666
[root@sv7 ~]# sed '/2024/s/2017/6666/g' shu.txt #找含有2024的行,将里面的所有2017替换成6666
思考:如果想把 /bin/bash 替换成 /sbin/sh 怎么操作?
[root@sv7 ~]# head -1 /etc/passwd > user #准备素材文件
[root@sv7 ~]# sed 's//bin/bash//sbin/sh/' user #直接替换,报错
[root@sv7 ~]# sed 's/\/bin\/bash/\/sbin\/sh/' user #使用转义符号\(屏蔽特殊符号)可以成功,但不方便
[root@sv7 ~]# sed 's,/bin/bash,/sbin/sh,' user #最佳方案,更改s的替换符;s后面跟/,/就是替换符;s后面跟!,!就是替换符;s后面跟,那么,就是替换符
[root@sv7 ~]# sed 's(/bin/bash(/sbin/sh(' user #替换符号可以用键盘上大部分字符
sed中的 a 和 i 和 c
a:append 行后追加
i:insert 行前插入
c:替换,替换一行内容
[root@sv7 ~]# cat user
root:x:0:0:root:/root:/bin/bash
[root@sv7 ~]# sed '1a xx' user
root:x:0:0:root:/root:/bin/bash
xx
[root@sv7 ~]# sed '1i xx' user
xx
root:x:0:0:root:/root:/bin/bash
[root@sv7 ~]# sed '1c xx' user
xx