sed流编辑器

类似vim编辑器,不过sed流编辑器输出的是模式空间的内容,并且他只修改显示屏上文件内容,不修改文件本身的内容


起言

**' '**内的s表示“替换”

     p表示“打印”

     d表示“删除”   

    ** -r **使用扩展正则

     -n   不输出模式空间的内容

     -i.bak 在修改文件之前,创建保存一份以.bak结尾的文件(会对原文件造成修改)

     -e 执行多条命令

sed '/root/p' passwd 在无选项情况下对root进行打印,可得模式空间和源文件内容

[root@localhost opt]# sed '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sed -n '/root/p' passwd 不输出模式空间的内容

[root@localhost opt]# sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

sed -i.bak '/root/d' passwd 删除了/opt/passwd中包含root的行(删除了源文件内容)

并且在/opt/目录下创建了以.bak结尾的文件

[root@localhost opt]# sed -i.bak '/root/d' passwd  -- 无输出结果
[root@localhost opt]# vim passwd         -- 可见第一行root被删除(源文件被修改)
bin:x:1:1:bin:/bin:/sbin/nologin      
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
...(以下省略)
[root@localhost opt]# ls
 example  ' passwd'   passwd   passwd.bak

sed -e 's/sbin/hello/' -e 's/nologin/world/' /opt/passwd | head -n 30 | tail -n 11 通过 -e 可以执行多条命令,对/opt/passwd进行了两次更换(模式空间的内容),并且通过 head -n 30 | tail -n 11选定了第20到第30行的内容,便于查看。

[root@localhost opt]# sed -e 's/sbin/hello/'  -e 's/nologin/world/' /opt/passwd | head -n 30 | tail -n 11
libstoragemgmt:x:994:990:daemon account for libstoragemgmt:/var/run/lsm:/hello/world
setroubleshoot:x:993:989:SELinux troubleshoot server:/var/lib/setroubleshoot:/hello/world
pipewire:x:992:987:PipeWire System Daemon:/var/run/pipewire:/hello/world
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/hello/world
geoclue:x:991:986:User for geoclue:/var/lib/geoclue:/hello/world
flatpak:x:990:985:User for flatpak system helper:/:/hello/world
gdm:x:42:42::/var/lib/gdm:/hello/world
cockpit-ws:x:989:984:User for cockpit web service:/nonexisting:/hello/world
cockpit-wsinstance:x:988:983:User for cockpit-ws instances:/nonexisting:/hello/world
gnome-initial-setup:x:987:982::/run/gnome-initial-setup/:/hello/world
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/hello/world
注意:在's/sbin/hello/'中,替换字符hello后要用/结尾。否则会报错sed: -e expression #1, char 12: unterminated `s' command

地址定界

使用sed需要指定处理的行数,要处理哪一行或者哪几行;如果不指定的话,默认会处理所有

1、#:#代表数字,指定要处理的行数 (cat -n 查看)

sed ‘p’ passwd 未指定行数多少,默认选择全部

[root@localhost opt]# sed 'p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
sync:x:5:0:sync:/sbin:/bin/sync
...(以下省略)

sed -n ‘3p’ passwd & sed ‘3p’ passwd 打印指定行数的内容

[root@localhost opt]# sed -n '3p' passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@localhost opt]# sed '3p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...(以下省略)

2、$: $表示文件的最后一行(p,d为处理动作)

  sed ‘$p’ passwd   打印最后一行   
[root@localhost opt]# sed '$p' passwd | tail -n 3
systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
zcw:x:1000:1000:zcw:/home/zcw:/bin/bash
zcw:x:1000:1000:zcw:/home/zcw:/bin/bash

sed ‘$d’ passwd 删除最后一行
[root@localhost opt]# cat -n passwd | tail -n 3
    33  tcpdump:x:72:72::/:/sbin/nologin
    34  systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
    35  zcw:x:1000:1000:zcw:/home/zcw:/bin/bash
[root@localhost opt]# sed '$d' passwd | tail -n3
dnsmasq:x:985:980:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin

3、/regexp/:表示匹配关键字regexp所在的行,可以基于基本正则和扩展正则进行匹配

sed -n '/root/p' passwd

[root@localhost opt]# sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

sed -nr '/^r{1,3}/p' passwd & sed -nr '/^s{1,3}/p' passwd 结合正则和扩展正则

[root@localhost opt]# sed -nr '/^s{1,3}/p' passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
sssd:x:995:991:User for sssd:/:/sbin/nologin
setroubleshoot:x:993:989:SELinux troubleshoot server:/var/lib/setroubleshoot:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
[root@localhost opt]# sed -nr '/^r{1,3}/p' passwd
root:x:0:0:root:/root:/bin/bash
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin

4、/regexp/I:表示忽略大小写

sed -n '/red/Ip' example

[root@localhost opt]# sed -n '/red/Ip' example 
rredhat
redhat
REDHAT
RREDHAT

5、%regexp%:表示匹配关键字regexp所在的行,当匹配的字符里面特殊符号,需要转义(与3类似,它可以去除特殊符号含义)

当匹配的字符里面有特殊符号,例如 / 等

只需要转移第一个特殊字符,在sed中它会认为后面的和前面一样

[root@localhost opt]# sed -n '\%/bin/bash%p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
zcw:x:1000:1000:zcw:/home/zcw:/bin/bash
在这之中,/bin/bash为一个关键字,其中bash后面的%是代表一个结尾,'/^r{1,3}/p'类似于这句话p前面的/,因为\将%去除本身含义

6、addr1,addr2 指定一个范围

1,20 指定1到20行

sed -n ‘1,20p’passwd

[root@localhost opt]# sed -n '1,10p' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

sed -n '1,/nobody/p' passwd 指定从第一行开始匹配到/nobody/

[root@localhost opt]# sed -n '1,/nobody/p' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

7、first~step:指定起始的位置及步长,例如:1~2表示1,3,5…

sed -n '1~5p' passwd 5为步长

[root@localhost opt]# sed -n '1~5p' passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
games:x:12:100:games:/usr/games:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
sssd:x:995:991:User for sssd:/:/sbin/nologin
geoclue:x:991:986:User for geoclue:/var/lib/geoclue:/sbin/nologin
gnome-initial-setup:x:987:982::/run/gnome-initial-setup/:/sbin/nologin
systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin

8、addr1,+N:指定行以及以后的N行

sed -n '1,+5p' passwd
[root@localhost opt]# sed -n '1,+5p' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync


sed -n '1,~5p' passwd

[root@localhost opt]#  sed -n '1,~5p' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sed -n '/^daemon/,/^ftp/p' passwd

[root@localhost opt]#  sed -n  '/^daemon/,/^ftp/p' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
# 做这个题的时候,出现了一个问题,原本命令(错误)为 sed -n  '/daemon/,/^ftp/p' passwd,会发现结果中ftp后面的行列也匹配到了,原因是daemon在passwd文件中不止一个,所以要对daemon进行指定唯一,加上^就可以了。

jsed编辑器(处理动作)

对文件进行编辑,删除,替换,打印等操作

  • p打印模式空间内容的同时也会打印修改后的内容

sed -n '/root/p' passwd

[root@localhost opt]# sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

  • d 删除匹配的行

sed '/root/d' passwd

[root@localhost opt]# sed '/root/d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sed '1,30d' passwd

[root@localhost opt]# sed '1,30d' passwd 
gnome-initial-setup:x:987:982::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
chrony:x:986:981::/var/lib/chrony:/sbin/nologin
dnsmasq:x:985:980:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
systemd-oom:x:978:978:systemd Userspace OOM Killer:/:/usr/sbin/nologin
zcw:x:1000:1000:zcw:/home/zcw:/bin/bash

  • a 在匹配的行后面添加内容

sed '1a\memeda' passwd

[root@localhost opt]# sed '1a\memeda' passwd 
root:x:0:0:root:/root:/bin/bash
memeda
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sed '/^daemon/a\memeda' passwd

[root@localhost opt]# sed '/^daemon/a\memeda' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
memeda
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

  • **c **修改匹配的行

sed '/root/c\memeda' passwd

[root@localhost opt]# sed '/root/c\memeda' passwd
memeda
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
memeda
games:x:12:100:games:/usr/games:/sbin/nologin

  • 指定关键字进行替换操作:** s**/查找的关键字/替换后的关键字 (/ 可以换成其他的符号 例如@ #等)

sed 's/root/memeda/' passwd 替换匹配到的第一个root

[root@localhost opt]# sed 's/root/memeda/' passwd
memeda:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sed 's/root/memeda/2' passwd 替换匹配到的第二个root

[root@localhost opt]# sed 's/root/memeda/2' passwd
root:x:0:0:memeda:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sed '1s/root/memeda/3' passwd 替换第一行的第三个root

[root@localhost opt]# sed '1s/root/memeda/3' passwd
root:x:0:0:root:/memeda:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sed '1,3s/sbin/memeda/' passwd 替换第一行到第三行的

[root@localhost opt]# sed '1,3s/sbin/memeda/' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/memeda/nologin
daemon:x:2:2:daemon:/memeda:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sed 's/sbin/memeda/g' passwd 全局替换

[root@localhost opt]# sed 's/sbin/memeda/g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/memeda/nologin
daemon:x:2:2:daemon:/memeda:/memeda/nologin
adm:x:3:4:adm:/var/adm:/memeda/nologin
lp:x:4:7:lp:/var/spool/lpd:/memeda/nologin
sync:x:5:0:sync:/memeda:/bin/sync
shutdown:x:6:0:shutdown:/memeda:/memeda/shutdown
...(以下省略)
  • i (中置或前置)在匹配的行前面追加内容

sed '1i\memeda' passwd

[root@localhost opt]# sed '1i\memeda' passwd
memeda
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sed '/root/i\memeda' passwd

[root@localhost opt]# sed '/root/i\memeda' passwd
memeda
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
memeda
operator:x:11:0:operator:/root:/sbin/nologin
  • i (后置)

sed 's/red/hello/gi' example 无视大小写

[root@localhost opt]# sed 's/red/hello/gi' example 
rhellohat
hellohat
rrrdhat
rrdrdhat
helloHAT
RhelloHAT
RRRRHAT
[root@localhost opt]# cat example 
rredhat
redhat
rrrdhat
rrdrdhat
REDHAT
RREDHAT
RRRRHAT

  • ! 表示取反 :如果地址后有!,则表示不匹配该行

sed '1!s/root/hello/g' passwd 除去第一行root不匹配,其他行都匹配

[root@localhost opt]# sed '1!s/root/hello/g' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/hello:/sbin/nologin
  • 删除字符(利用替换的特性,将匹配的字符串替换为空则为删除)

sed 's/root//' passwd

[root@localhost opt]# sed 's/root//' passwd
:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/:/sbin/nologin

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值