linux三剑客之sed
linux三剑客之sed
sed主要是用来修改文本 ,是linux中,流媒体编辑器
1、sed的格式
sed [参数] '处理规则' [操作对象]
参数:
参数 | 作用 |
---|---|
-e | 允许多项编辑 |
-n | 取消默认输出 |
-i | 就地编辑 |
-r | 支持拓展正则 |
-f | 指定sed匹配规则脚本文件 |
# 允许多项编辑 e
[root@zonghan ~]# cat 5.txt
123456 235 678
235 34
6547 235
7623
235 dfg
[root@zonghan ~]# sed -e '3d' -e '4d' 5.txt # e 允许多项编辑
123456 235 678
235 34
235 dfg
# 取消默认输出 n
[root@zonghan ~]# sed -e '3d' -e '4d' -n 5.txt # n 取消默认输出
[root@zonghan ~]# 所以什么都不显示
# 就地编辑(这里才是真的修改文件) i
[root@zonghan ~]# sed -i '3p' 5.txt # i 就地编辑
[root@zonghan ~]# cat 5.txt
123456 235 678
235 34
6547 235
6547 235 # 这里把 sed '3p' 5.txt 的结果 编辑到原文件内
7623
235 dfg
# 支持拓展正则(普通正则不需要加参数) r
[root@zonghan ~]# cat 5.txt
123456 235 678
235 34
6547 235
7623
235 dfg
[root@zonghan ~]# sed -r '/(235)+/d' 5.txt # r 支持拓展正则(普通正则不需要加参数)
7623
# 指定sed匹配规则脚本文件 f
[root@zonghan ~]# vim 6.txt 里面写的是/235/d
[root@zonghan ~]# sed -f 6.txt 5.txt # f 把正则表达式写入文件以及编辑模式 等价于变量赋值
7623
编辑模式(sed中的重点):
模式 | 作用 |
---|---|
d | 删除 |
p | 打印 |
a | 在当前行后添加一行或多行 |
c | 用新文本修改(替换)当前行 |
i | 在当前行之前,插入文本(单独使用时) |
r | 在文件中读内容 |
w | 将指定行写入文件 |
y | 将字符转换成另一个字符 |
s | 将字符串转换成另一个字符串(每一行只替换一次) |
g | 全部执行 |
i | 忽略大小写(跟 s 模式一起使用时) |
& | 代表前面匹配到的内容 |
# 删除 d
[root@zonghan ~]# cat 5.txt
123456 235 678
235 34
6547 235
7623
235 dfg
[root@zonghan ~]# sed '3d' 5.txt # d 删除指定行
123456 235 678
235 34
7623
235 dfg
# 打印 p
[root@zonghan ~]# sed '3p' -n 5.txt # p 打印
6547 235
# 在当前行后添加一行或多行 a
[root@zonghan ~]# sed '2axxx' 5.txt # a 添加
123456 235 678
235 34
xxx
6547 235
7623
235 dfg
# 用新文本修改(替换)当前行 c
[root@zonghan ~]# sed '3cxxx' 5.txt # c 修改(替换)
123456 235 678
235 34
xxx
7623
235 dfg
# 在当前行之前,插入文本(单独使用时)i
[root@zonghan ~]# sed '2ixxx' 5.txt # i 上一行插入文本
123456 235 678
xxx
235 34
6547 235
7623
235 dfg
# 在文件中读内容插入到另一文件 r(暂未真实改变文本内容)
[root@zonghan ~]# cat 6.txt
/235/d
[root@zonghan ~]# sed '3r 6.txt' 5.txt # r 把读出文件内容插入指定文本的指定行的下一行
123456 235 678
235 34
6547 235
/235/d
7623
235 dfg
# 在文件中指定行写入到另一文件(文件可以不存在) w
[root@zonghan ~]# sed '2w w.txt' 5.txt # 把读到的内容写入新文件
123456 235 678
235 34
6547 235
7623
235 dfg
[root@zonghan ~]# cat w.txt
235 34
# 将字符转换成另一个字符(是替换字符不是字符串) y
[root@zonghan ~]# cat 2.txt
asfseadasd a
asd fesas gdf ga
sdf ase w
SDF fsd dst hdh
ewshgfhjdrghdrgew
[root@zonghan ~]# sed '5y/sh/qw/' 2.txt # y 将指定字符替换成指定字符
asfseadasd a
asd fesas gdf ga
sdf ase w
SDF fsd dst hdh
ewqwgfwjdrgwdrgew
# 将字符串转换成另一个字符串(每一行只替换一次)s
[root@zonghan ~]#
[root@zonghan ~]# cat 7.txt
8
9m9
10
9
9
[root@zonghan ~]# sed 's/9/tt/' 7.txt # s 替换字符串(每一行只替换一次)
8
ttm9
10
tt
tt
# 全部执行 g
[root@zonghan ~]# sed 's/9/tt/g' 7.txt # 和s连用可以全部替换
8
ttmtt
10
tt
tt
# 忽略大小写(跟 s 模式一起使用时)i
[root@zonghan ~]# cat 2.txt
asfseadasd a
asd fesas gdf ga
sdf ase w
[root@zonghan ~]# sed 's/A/v/gi' 2.txt # i 忽略大小写
vsfsevdvsd v
vsd fesvs gdf gv
sdf vse w
# 代表前面匹配到的内容 &
[root@zonghan ~]# sed 's/.*/#&/g' 2.txt # &号是代表前面所匹配到的所有信息
#asfseadasd a
#asd fesas gdf ga
#sdf ase w
定位(sed中非常重要的内容):
说明: 正则表达式前后加/或#或$符号都行
1、数字定位法
指定行号删除。
[root@zonghan ~]# cat 5.txt
123456 235 678
235 34
6547 235
7623
235 dfg
[root@zonghan ~]# sed '2,3d' 5.txt
123456 235 678
7623
235 dfg
2、正则定位法
指定正则定位。
[root@zonghan ~]# sed '/^2/d' 5.txt
123456 235 678
6547 235
7623
3、数字和正则定位法
[root@zonghan ~]# sed '1,/^2/d' 5.txt
6547 235
7623
235 dfg
4、正则正则定位法
[root@zonghan ~]# sed '/^1/,/^2/d' 5.txt # 删除以1开头到以2开头的行
6547 235
7623
235 dfg
案例
1、将nginx.conf中的注释行全部去掉
[root@localhost ~]# sed '/^ *#/d' /etc/nginx/nginx.conf
2、将nginx.conf中每一行之前增加注释
[root@localhost ~]# sed 's/.*/# &/g' /etc/nginx/nginx.conf
3、要求一键修改本机的ip,
192.168.15.100 ---> 192.168.15.101
172.16.1.100 ---> 172.16.1.101
sed -i 's#.100#.101#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
4、将/etc/passwd中的root修改成ROOT
sed -i 's#root#ROOT#g' /etc/passwd