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
posted @ 2021-12-21 20:19  zong涵  阅读(64)  评论(0编辑  收藏  举报