sed
作用:过滤(类似grep) 替换 修改 格式化输出
语法结构:
sed '模式+动作' file
sed '找谁 干啥' file
三剑客都支持处理屏幕上显示的信息
ip a|sed ''
参数选项:
sed -n 取消默认输出(默认全部输出到屏幕上)
p #print 输出 打印
sed -r 支持拓展正则
模式:查找文件的字符串的行
动作:找到内容后的动作 增删改查
sed指定行查找(有n必有p)
环境准备
[root@shang:~]# cat a.txt
I am shangwenhao.
Nice to meet you.
test
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
not 572891888887.
^^^^^^^^667788##%%$$$$$$$^^^$$
shangwenhaoshangwenhao
shangwenhaosssss
案例1:sed按行查找
[root@shang:~]# sed -n '6p' a.txt
My favorite foods are pig's trotters and mutton soup.
案例2:sed输出最后一行 $
[root@shang:~]# sed -n '$p' a.txt
shangwenhaosssss
案例3:区间范围使用逗号 表示区间范围的意思
[root@shang:~]# sed -n '5,7p' a.txt
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
案例4:sed输出10到最后一行
[root@shang:~]# sed -n '10,$p' a.txt
not 572891888887.
^^^^^^^^667788##%%$$$$$$$^^^$$
shangwenhaoshangwenhao
shangwenhaosssss
案例5:sed查看第五行和第十行
[root@shang:~]# sed -n '5p;10p' a.txt
I enjoy playing games and fishing.
not 572891888887.
总结: #注:file为家目录下的1.txt #6p即6行
指定行查找语法结构 sed -n '6p' ./1.txt
sed按行查找无法使用|
sed按行查找最后一行$
使用逗号表示区间范围
1、sed按行查找
sed -n '8p' ./1.txt
2、sed输出最后一行 $
sed -n '$p' ./1.txt
3、区间范围使用逗号 表示区间范围的意思
sed -n '3,5p' ./1.txt
4、sed输出10到最后一行
sed -n '10,$p' ./1.txt
5、sed查看第五行和第十行
sed -n '5p;10p' ./1.txt
sed模糊过滤(字符串)
案例1:查找包含shang的行
[root@shang:~]# sed -n '/shang/p' a.txt
I am shangwenhao.
shangwenhaoshangwenhao
shangwenhaosssss
案例2:查找包含favorite的行
[root@shang:~]# sed -n '/favorite/p' a.txt
My favorite foods are pig's trotters and mutton soup.
案例3:查找以t结尾的行
[root@shang:~]# sed -n '/t$/p' a.txt
test
案例4:查找包含或a 或b 或z的行
[root@shang:~]# sed -rn '/a|b|z/p' a.txt
I am shangwenhao.
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
shangwenhaoshangwenhao
shangwenhaosssss
案例5:查找字符串的区间范围使用逗号
[root@shang:~]# sed -n '/test/,/aaaa,/p' a.txt
test
I enjoy playing games and fishing.
My favorite foods are pig's trotters and mutton soup.
My email number is 3511606727@qq.com.
aaaa,
注意: # 唯一的字符串
如果有两个结尾 则匹配到第一个结尾终止
[root@shang:~]# cat a.txt
1 aaa
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
[root@shang:~]# sed -n '/vvv/,/bbb$/p' a.txt
2 vvv
3 bbb
如果只有开头 没有匹配到结尾 则会输出到文件末尾
[root@shang:~]# sed -n '/vvv/,/bbbbb$/p' a.txt
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
案例:匹配昨天一天的数据 把时间作为字符串来匹配
需要具体时间 模糊查找 不能类似:
sed '/2024:9:00/,/2024:10:00/p' file
sed模糊过滤总结:
作用:过滤文件中的字符串 类似grep 都支持正则
语法结构:
sed -n '/字符串/p' file
sed -n '/[]/p' file
sed -r #支持拓展正则
1、查找包含10的行
sed -n '/10/p' 1.txt
2、查找包含 ooo 的行
sed -n '/ooo/p' 1.txt
3、查找以b结尾的行
sed -rn '/b$/p' 1.txt
3、查找以b为开头的行
sed -rn '/^b/p' 1.txt
4、查找包含9或者ppp的行
sed -rn '/9|ppp/p' 1.txt
5、查找包含或a 或b 或z的行
sed -rn '/a|b|c/p' 1.txt
6、查找字符串的区间范围使用逗号 ooo-ppp
sed -n '/ooo/,/ppp/p' 1.txt
注意:如果有两个结尾 则匹配到第一个结尾终止
如果只有开头 没有匹配到结尾 则会输出到文件
sed删除
环境准备
[root@shang:~]# cat a.txt
1 aaa
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
案例1:指定行删除
[root@shang:~]# sed '3d' a.txt
1 aaa
2 vvv
4 ddd
...
案例2:删除区间
[root@shang:~]# sed '3,10d' a.txt
1 aaa
2 vvv
11 ddd
12 ooo
#字符串区间
[root@shang:~]# sed '/vvv/,/uuu/d' a.txt
1 aaa
10 bbb
11 ddd
12 ooo
案例3:删除包含aaa的行 #模糊过滤
[root@shang:~]# sed '/aaa/d' a.txt
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
9 uuu
10 bbb
11 ddd
12 ooo
案例4:删除包含ddd 或者 aaa的行
[root@shang:~]# sed -r '/aaa|ddd/d' a.txt
2 vvv
3 bbb
5 ccc
6 kkk
7 lll
9 uuu
10 bbb
12 ooo
总结:
sed删除的语法结构为:sed '//d' file
sed '行数d' file
1、指定行删除
sed '行数d' file
2、删除区间
sed '行数,行数d' file
3、删除字符串区间
sed '/字符串/,/字符串/d' file
4、删除包含fff的行
sed '/fff/d' file
sed增加内容
语法结构:###临时
sed '3c shang' file #将第三行替换为shang
例:
[root@shang:~]# sed '3c shangwenhao' a.txt
1 aaa
2 vvv
shangwenhao
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
sed '3i shang' file #在第三行插入字符串
例:
[root@shang:~]# sed '3i shangwenhao' a.txt
1 aaa
2 vvv
shangwenhao
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
sed '3a shang' file #在第三行的下面追加字符串
例:
[root@shang:~]# sed '3a shangwenhao' a.txt
1 aaa
2 vvv
3 bbb
shangwenhao
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
sed替换
案例1:将文件中所有的aaa替换
[root@shang:~]# sed 's#aaa#shang#g' a.txt
1 shang
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 shang
9 uuu
10 bbb
11 ddd
12 ooo
案例2:sed 's###g' file 只替换每行中的第一个
[root@shang:~]# sed 's#1#shang#' a.txt
shang aaa
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
shang0 bbb
shang1 ddd
shang2 ooo
案例3:将开头替换为#
[root@shang:~]# sed 's/^/#/g' a.txt
#1 aaa
#2 vvv
#3 bbb
#4 ddd
#5 ccc
#6 kkk
#7 lll
#8 aaa
#9 uuu
#10 bbb
#11 ddd
#12 ooo
案例4:将第八行的aaa替换为521
[root@shang:~]# sed '8s#aaa#521#g' a.txt
1 aaa
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 521
9 uuu
10 bbb
11 ddd
12 ooo
案例5:将包含vvv的行的2替换成2222
[root@shang:~]# sed '/vvv/s#2#2222#g' a.txt
1 aaa
2222 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
10 bbb
11 ddd
12 ooo
案例6:将10-12行的1替换为--
[root@shang:~]# sed '10,12s#1#--#g' a.txt
1 aaa
2 vvv
3 bbb
4 ddd
5 ccc
6 kkk
7 lll
8 aaa
9 uuu
--0 bbb
---- ddd
--2 ooo
案例7:删除所有a-z
[root@shang:~]# sed 's#[a-z]# #g' a.txt
1
2
3
4
5
6
7
8
9
10
11
12
总结:
语法结构:#可以使用# 要是语法冲突使用//
sed 's#aaaa#bbbb#g' file
sed 's///g' file
sed -i #永久替换参数
sed 's#[a-z]##g' file #删除所有字符
#将文件中的所有aaaa替换为bbbb
1、将文件中所有的aaa替换
sed 's#aaa#123123#g' 1.txt
2、sed 's###' file 只替换每行中的第一个 #没有g
sed 's#1#520#' 1.txt
模式+动作
语法结构:#模糊搜索
sed '3s###g' file
#将第三行的xxx替换为xxx
1、模糊搜索 将第八行的fff替换为521
sed '8s#fff#521#g' 1.txt
2、模糊搜索 将包含mmm的行的2345替换成7890
sed '/mmm/s#2345#7890#g' 1.txt
3、将10-13行的1替换为--
sed '10,13s#1#--#g' 1.txt
4、将a-z替换成()#可以替换为空格
sed 's#[a-z]#()#g' 1.txt
注意-放在[]写到两边
sed后向引用#了解
语法结构:
sed -r 's#(old)(boy)#\1#g' file
\1 表示引用第一个 \2 表示引用第二个