1. Sed概述
Linux三剑客老二
Sed是Stream Editor(流编辑器
)缩写,操作、过滤和转换文本内容的强大工具
有增删改查、过滤、取行。
语法格式:
sed [options] [sed-commands] [input-file]
sed [选项] [sed命令] [输入文件]
sed --version # 查看sed软件版本
注意事项:
- 注意sed和后面的选项之间至少有一个空格。
- sed日常使用 ‘’单引号和””双引号无区别,变量除外
- 为了避免混淆,本文称呼sed为sed软件。sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令。
- sed-commands既可以是单个sed命令,也可以是多个sed命令组合。
- nput-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入。
命令执行流程
概括流程:Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行……
2. Sed增删改查
a 追加文本到指定行后
i 插入文本到指定行前
d 删除指定行
p 打印指定行
c 按行替换
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对1,3,5,7,……行操作
10,${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/xmh/{sed-commands} 对匹配xmh的行操作
/xmh/,/Alex/{sed-commands} 对匹配xmh的行到匹配Alex的行操作
/xmh/,${sed-commands} 对匹配xmh的行到最后一行操作
/xmh/,10{sed-commands} 对匹配xmh的行到第10行操作
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/xmh/,+2{sed-commands} 对匹配xmh的行到其后的2行操作
模拟文件
cat >>person.txt<<EOF
101,xmh,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF
1.sed 增
//追加内容到第二行前
[root@xmh ~]# sed '2a 1022,dandan,CSO' person.txt
//插入内容到第二行后
[root@xmh ~]# sed '2i 1022.1,dandan,CSO' person.txt
//插入内容到文本结尾,sed中固定用法 $a 表示结尾
[root@xmh ~]# sed '$a new,new,new' person.txt
//多行追加,插入多行内容至第二行后
[root@xmh ~]# sed '2i 1022,dandan,CSO\n1023,binbin,CCO' person.txt
2.sed 删
//删除所有内容
[root@xmh ~]# sed 'd' person.txt
//删除第五行的内容
[root@xmh ~]# sed '5d' person.txt
//删除第一行和第三行的内容
[root@xmh ~]# sed '1,3d' person.txt
//删除第一行到第五行的内容(1+4=5)
[root@xmh ~]# sed '1,+4d' person.txt
//删除奇数行,留下偶数行,固定写法 1~2 表示奇数、
[root@xmh ~]# sed '1~2d' person.txt
//删除最后一行的内容
[root@xmh ~]# sed '$d' person.txt
//打印文件内容,但不包含yy
[root@xmh ~]# sed '/yy/d' person.txt
//打印文件内容,不包含空行
[root@xmh ~]# sed '/^$/d' person.txt
[root@xmh ~]# sed -n '/^$/!p' person.txt
3.sed 改
//替换第二行的内容
[root@xmh ~]# sed '2c 102,lisi,CTO' person.txt
//将每行中第一处匹配的字符进行替换
[root@xmh ~]# sed 's#O#1#' person.txt
//将每行中的所有匹配的字符进行替换
[root@xmh ~]# sed 's#O#1#g' person.txt
4.sed 查
//打印第二行内容,但默认会输出2次匹配的结果,使用-n取消默认输出
[root@xmh ~]# sed -n '2p' person.txt
//打印第二行至第四行内容
[root@xmh ~]# sed -n '2,4p' person.txt
//打印全部内容
[root@xmh ~]# sed -n 'p' person.txt
//打印文件包含XMH的行至包含103的所有行内容
[root@xmh ~]# sed -n '/XMH/,/^103/p' person.txt
//打印文件中只包含XMH或者Alex的行
[root@xmh ~]# sed -nr '/XMH|Alex/p' person.txt
//查询多行,打印第一,第三,第四行的内容,; 引号匹配不同单行
[root@xmh ~]# sed -n '1p;3p;4p' person.txt
5.sed扩展知识
//修改文件前自动备份文件,-i.ori
[root@xmh ~]# sed -i.ori 's#xmh#XMH#g' person.txt
[root@xmh ~]# ls -l person.txt*
-rw-r--r--. 1 root root 68 Feb 11 17:45 person.txt
-rw-r--r--. 1 root root 68 Feb 11 17:44 person.txt.ori
//利用变量进行替换,注意双引号
[root@xmh ~]# y=xmh
[root@xmh ~]# x=XMH
[root@xmh ~]# sed -r "s#$x#$y#g" person.txt
//反向引用
// \1 引用第一个小括号中的匹配内容,\2 引用第二个小括号中的匹配内容,sed最多记住9个
[root@xmh ~]# ip add show eth0 | sed -rn '3s#^.*inet (.*)/24.*$#\1#gp'
10.0.0.200
[root@xmh ~]# stat passwd |sed -rn '4s#^.*\(0(.*)/-.*$#\1#gp'
644