三剑客之sed

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 表示引用第二个

孩儿立志出乡关,学不成名誓不还。埋骨何须桑梓地,人生无处不青山。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇