1. Sed概述

Linux三剑客老二
Sed是Stream Editor(流编辑器)缩写,操作、过滤和转换文本内容的强大工具
有增删改查、过滤、取行。

语法格式:

  1. sed [options] [sed-commands] [input-file]
  2. sed [选项] [sed命令] [输入文件]
  3. sed --version # 查看sed软件版本

注意事项:

  1. 注意sed和后面的选项之间至少有一个空格。
  2. sed日常使用 ‘’单引号和””双引号无区别,变量除外
  3. 为了避免混淆,本文称呼sed为sed软件。sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令。
  4. sed-commands既可以是单个sed命令,也可以是多个sed命令组合。
  5. 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