知识点
-
查看sed帮助
man sed
-
语法格式
sed [options] [sed-commands] [input-file] -
[sed-commands]命令
a:增加
i:插入
d:删除
c:按行替换
s:文本替换:与g连用全局标志,与i连用匹配忽略大小写
p:查询,与-n选项连用
w:另存文件
l:打印不可见字符
q:退出sed
n:清空当前模式空间,然后读入下一行
N:不清空当前模式空间,然后读入下一行,以\n分隔两行 -
[options]命令
-i:将修改的内容保存到文本中
-r:启用扩展正则表达式
-n:取消默认输出(默认输出所有行)
-e:执行多条sed命令
-f:后接sed脚本文件名 -
指定执行的地址(行)范围
第10行: 10{sed-commands}
第10-20行: 10,20{sed-commands}
10行后面20行: 10,+20{sed-commands}
1,3,5,7…行: 1`2{sed-commands}
2,4,6,8…行: 2`2{sed-commands}
第10行到最后行: 10,${sed-commands}
正则匹配包含zhangsan字符串行执行: /zhangsan/{sed-commands}
正则匹配包含zhangsan字符串行到包含wangwu字符串行执行: /zhangsan/,/wangwu/{sed-commands}
正则匹配包含zhangsan字符串行到结尾行执行: /zhangsan/,${sed-commands}
正则匹配包含zhangsan字符串行到后面20行: /zhangsan/,+20{sed-commands}
第10行到包含zhangsan字符串的最近的一行 10,/zhangsan/{sed-commands} -
特殊符号
&:代表被替换的内容
=:获取行号
{}:合并执行命令
实例
-
增加数据(a,i)
第二行后面增加一行数据[root@localhost ~]# sed '2a 107,test,ccc' test.txt 100,zhangsan,CEO 101,lisi,CTO 107,test,ccc 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
第二行后面增加多行数据
[root@localhost ~]# sed '2a 107,test,ccc\n108,test1,XXX' test.txt 100,zhangsan,CEO 101,lisi,CTO 107,test,ccc 108,test1,XXX 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
[root@localhost ~]# sed '2a 107,test,ccc\ > 108,test1,XXX' test.txt 100,zhangsan,CEO 101,lisi,CTO 107,test,ccc 108,test1,XXX 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
第二行前面插入一行数据
[root@localhost ~]# sed '2i 107,test,ccc' test.txt 100,zhangsan,CEO 107,test,ccc 101,lisi,CTO 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
-
删除数据(d)
删除第二行数据[root@localhost ~]# sed '2d' test.txt 100,zhangsan,CEO 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
删除2-4行数据
[root@localhost ~]# sed '2,4d' test.txt 100,zhangsan,CEO 104,xiaohong,CIO 105,wangba,CUO
[root@localhost ~]# sed '2,+2d' test.txt 100,zhangsan,CEO 104,xiaohong,CIO 105,wangba,CUO
-
行替换( c )
将第二行数据替换[root@localhost ~]# sed '2c 1010,test,CCC' test.txt 100,zhangsan,CEO 1010,test,CCC 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
-
文本替换
替换模型:sed -i ‘s#被替换字符串#替换字符串#g’ 输入流 或 sed -i ‘s/被替换字符串/替换字符串/g’ 输入流
Ms# # #Ng:对M行操作,无g标志,对匹配的第1列处理,有g标志,对整行操作
Ng:从第N处/列开始替换替换第2行,第2列开始字符串
[root@localhost ~]# sed '2s#1#0#2g' num.txt 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1
将zhangsan字符串替换为test字符串
[root@localhost ~]# sed 's#zhangsan#test#g' test.txt 100,test,CEO 101,lisi,CTO 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
-
变量替换
不能使用单引号(所见及所得),会将$x,$y当做字符串处理[root@localhost ~]# cat 1.txt a b a [root@localhost ~]# x=a [root@localhost ~]# y=b [root@localhost ~]# sed 's#$x#$y#g' 1.txt a b a [root@localhost ~]# sed s#$x#$y#g 1.txt b b b [root@localhost ~]# sed "s#$x#$y#g" 1.txt b b b [root@localhost ~]# sed 's#'$x'#'$y'#g' 1.txt b b b [root@localhost ~]# eval sed 's#$x#$y#g' 1.txt b b b
-
分组替换 () \1
开机自启开启需要的服务[root@study ~]# chkconfig --list|grep 3:on|grep -vE "sshd|crond|network"|awk '{print $1}'|sed -r 's#(.*)#chkconfig \1 off#g' |bash
-
特殊符号&,代表被替换的内容
将1-5行中的x字符串替换为–x--字符串[root@localhost ~]# sed '1,5s#x#--&--#g' test.txt 100,zhangsan,CEO 101,lisi,CTO 102,wangwu,COO 103,--x--iaoming,CFO 104,--x--iaohong,CIO 105,wangba,CUO
-
特殊符号=,显示行号
[root@localhost ~]# sed '=' test.txt 1 100,zhangsan,CEO 2 101,lisi,CTO
[root@localhost ~]# sed '=' test.txt |sed 'N;s#\n# #' 1 100,zhangsan,CEO 2 101,lisi,CTO 3 102,wangwu,COO 4 103,xiaoming,CFO 5 104,xiaohong,CIO 6 105,wangba,CUO
每行前后加上–字符
[root@localhost ~]# sed -r 's#(.*)#---&-#g' test.txt ---100,zhangsan,CEO- ---101,lisi,CTO- ---102,wangwu,COO- ---103,xiaoming,CFO- ---104,xiaohong,CIO- ---105,wangba,CUO-
对2,4行先执行打印,然后在显示行号
[root@localhost ~]# sed -n '2,4{p;=}' test.txt 101,lisi,CTO 2 102,wangwu,COO 3 103,xiaoming,CFO 4
等同于
[root@localhost ~]# sed -n '2,4p;2,4=' test.txt 101,lisi,CTO 2 102,wangwu,COO 3 103,xiaoming,CFO 4
-
输出指定的第二行(p,-n)
[root@localhost ~]# sed -n '2p' test.txt 101,lisi,CTO
-
另存文件(w)
将test.txt文件另存为2.txt[root@localhost ~]# sed 'w 2.txt' test.txt 100,zhangsan,CEO 101,lisi,CTO 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO [root@localhost ~]# ll total 12 -rw-r--r--. 1 root root 94 Nov 21 03:51 2.txt -rw-r--r--. 1 root root 94 Nov 20 23:40 test.txt
-
一条sed语句执行多条sed命令
删除第4行到末尾的数字,并把10替换为01[root@localhost ~]# sed '4,$d' test.txt| sed 's#10#01#g' 010,zhangsan,CEO 011,lisi,CTO 012,wangwu,COO
[root@localhost ~]# sed -e '4,$d' -e 's#10#01#g' test.txt 010,zhangsan,CEO 011,lisi,CTO 012,wangwu,COO
[root@localhost ~]# sed '4,$d;s#10#01#g' test.txt 010,zhangsan,CEO 011,lisi,CTO 012,wangwu,COO
-
打印不可见字符
[root@localhost ~]# sed -n 'l' test.txt 100,zhangsan,CEO$ 101,lisi,CTO$ 102,wangwu,COO$ 103,xiaoming,CFO$
-
模拟其它命令
cat[root@localhost ~]# sed '' test.txt 100,zhangsan,CEO 101,lisi,CTO
grep
[root@localhost ~]# sed -n '/zhangsan/p' test.txt 100,zhangsan,CEO
grep -v
[root@localhost ~]# sed -n '/zhangsan/!p' test.txt 101,lisi,CTO 102,wangwu,COO 103,xiaoming,CFO 104,xiaohong,CIO 105,wangba,CUO
head
[root@localhost ~]# sed -n '1,2p' test.txt 100,zhangsan,CEO 101,lisi,CTO
[root@localhost ~]# sed '3,$d' test.txt 100,zhangsan,CEO 101,lisi,CTO
wc
[root@localhost ~]# sed -n '$=' test.txt 6