Shell的sed与正则表达式

本文详细介绍了sed命令的基本原理、选项使用、内置命令如a、d、i、p和s的用法,以及如何结合正则表达式进行文本处理,包括行选择、插入、删除和替换操作。通过实例演示了如何在实际场景中灵活运用sed进行文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sed命令:过滤处理操作

sed [选项] [sed的内置命令] 执行文件

sed的原理:
    从执行文件从按行读取数据,然后存储到sed的存储区,再通过匹配对应的数据,进行过滤或修改
#匹配失败,默认会输出到屏幕(可以取消);匹配成功则进行编辑(通过对应的策略,然后输出到屏幕)


选项:
    -n    取消sed的默认输出,常与p命令一起使用
    -i    直接将修改的结果写入文件(如果不用i,则默认修改的只是sed的内存数据,即:文件数据没有修改)
    -e    多次编辑,不需要管道符
    -r    支持扩展正则表达式

sed内置命令:
    a    对文本追加操作,在指定行后添加一行/多行文本
    d    对文本进行匹配删除操作
    i    插入文本操作,在指定行前添加一行/多行文本
    p    打印输出,通常p与-n一起使用
    s/正则/替换内容/g    匹配正则,然后替换内容(支持正则),g代表全局匹配

sed的匹配范围:
    1.空地址(全文处理)
    2.单地址(指定文件某一行)
    3./xxx/(被模式匹配到的每一行)
    4.范围区间(10,20代表匹配十到二十行;10,+5第十行向下5行;/xxx1/,/xxx2/)
    5.步长(1~2,表达1,3,5,7,9...行;2~2表示2,4,6,8...行)

sed匹配:

[root@control /]# cat nihao 
ni hao 
my name is lubo
nice to meet your

①sed的输出:

#输出nihao文件里面的2-5行文件(只输出这4行,如果没有4行也不会报错)
[root@control /]# sed "2,+5p"  nihao -n
my name is lubo
nice to meet your

#输出nihao文件里面的含义a的行(只输出)
[root@control /]# sed "/a/p" nihao -n
ni hao 
my name is lubo

#如果sed匹配时,没有带上-n则会输出两次匹配的行
[root@control /]# sed "/a/p" nihao 
ni hao 
ni hao 
my name is lubo
my name is lubo
nice to meet your

②sed的删除:

删除nihao文件里面的含义a的行
[root@control /]# sed "/a/d" nihao 
nice to meet your
[root@control /]# cat nihao 
ni hao 
my name is lubo
nice to meet your 
#只使用sed则为删除数据缓存(sed的缓存区,而不是文本文件),如果需要真正的删除需要加上-i

[root@control ~]# sed '3,$d'  /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
从/etc/passwd文件的第五行删到结尾(需要使用''而不是"")

[root@control /]# sed '2d' nihao 
ni hao 
nice to meet your 
[root@control /]# sed '2,+1d' nihao 
ni hao 
#sed可以删除指定行和多余行

③sed的追加:

[root@control /]# sed '3a  hehe' nihao   
ni hao 
my name is lubo
nice to meet your 
hehe
#在第三行插入hehe

[root@control /]# sed '5a  hehe' nihao  
ni hao 
my name is lubo
nice to meet your 
#在第五行插入hehe,但是没有插入进去

④sed的插入:

[root@control /]# sed '2i shabi' nihao 
ni hao 
shabi
my name is lubo
nice to meet your 

[root@control /]# sed '9i shabi' nihao  
ni hao 
my name is lubo
nice to meet your
#插入和追加一样,只是插入是在行之前加入内容,而追加是在之后

⑤sed的替换:

[root@control /]# sed   's/lubo/lsp/p' nihao 
ni hao 
my name is lsp
my name is lsp
nice to meet your 
#此时带上p输出,则是会输出缓存中的数据

[root@control /]# sed   's/lubo/lsp/' nihao  
ni hao 
my name is lsp
nice to meet your 
#没有带上p,则是输出已经匹配修改过的数据

sed与正则表达式的匹配输出:

[root@control /]# ifconfig  ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.220.135  netmask 255.255.255.0  broadcast 192.168.220.255
        ether 00:0c:29:35:4c:8c  txqueuelen 1000  (Ethernet)
        RX packets 22441  bytes 21250992 (20.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8164  bytes 1002165 (978.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#首先sed第二行,然后将网关的前缀取出,在将后缀取出
[root@control /]# ifconfig ens160 | sed '2p' -n |sed 's/^.*inet//p' -n | sed 's/netmask.*$//p' -n
 192.168.220.135

#使用-e取消管道符,-n用来取消缓存输出
[root@control /]# ifconfig ens160 | sed -ne '2s/^.*inet//' -e '2s/net.*$//p'  
 192.168.220.135 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值