shell(1):sed

ShineLee / 2023-08-08 / 原文

学习自:sed 文本选取、替换、删除、新增的命令

1、用法

sed [选项] '动作' 文件名

2、作用

sed用于将数据进行选取、替换、删除、新增的命令。

3、选项与动作

选项

说明

-e 允许对输入数据用多条sed命令编辑
-f 脚本文件 从sed脚本中读入sed操作。类似awk的-f
-i 用sed的结果修改原文件,而非从屏幕输出
-n

一般sed命令会把所有数据都输出到屏幕

加入该项之后,只会把经过sed命令处理的行输出到屏幕

-r 在sed中支持扩展正则表达式

 

动作

说明

c str

替换,用c后的字符串替换原数据行。

替换多行时,除最后一行外,每行末尾都要用"'代表数据未完结

d 删除指定行
num a \

追加,在当前行后添加一行或多行。

添加多行时,除最后一行外,每行末尾需要用"\"代表未完结。

num表示第几行

num i \

插入,在当前行前插入一行或多行。

插入多行时,除了最后一行外,每行末尾要用""代表未完结。

num表示第几行

p 打印指定行
s

字串替换,用一个字符串替换另外一个字符串。

格式:行范围s/"旧字串/新字串/g"(类似vim中的替换)

4、说明

sed所作的修改不会影响文件自身内容(如果是管道,则连文件都没有),而是把输出结果显示到屏幕上,除非使用"-i"选项才会直接修改文件。

5、例子

先对/etc/passwd进行调整,构造一个passwd2


awk -F':' '{for (i=1;i<=NF;i++)printf("%s ",$i);printf("\n")}' /etc/passwd | awk '{print > "passwd2"}'
 
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 99 99 Nobody / /sbin/nologin
systemd-network x 192 192 systemd Network Management / /sbin/nologin
dbus x 81 81 System message bus / /sbin/nologin
polkitd x 999 998 User for polkitd / /sbin/nologin
libstoragemgmt x 998 997 daemon account for libstoragemgmt /var/run/lsm /sbin/nologin
abrt x 173 173 /etc/abrt /sbin/nologin
rpc x 32 32 Rpcbind Daemon /var/lib/rpcbind /sbin/nologin
chrony x 997 994 /var/lib/chrony /sbin/nologin
tss x 59 59 Account used by the trousers package to sandbox the tcsd daemon /dev/null /sbin/nologin
geoclue x 996 993 User for geoclue /var/lib/geoclue /sbin/nologin
sshd x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologin
postfix x 89 89 /var/spool/postfix /sbin/nologin
ntp x 38 38 /etc/ntp /sbin/nologin
tcpdump x 72 72 / /sbin/nologin
vboxuser x 1000 1000 vboxuser /home/vboxuser /bin/bash
miduser x 1001 1001 /home/miduser /bin/bash

①打印——p

#想看某行(会把某行重复显示,同时会显示全部行):
sed '2p' passwd2
root x 0 0 root /root /bin/bash 
bin x 1 1 bin /bin /sbin/nologin 
bin x 1 1 bin /bin /sbin/nologin 
daemon x 2 2 daemon /sbin /sbin/nologin 
...
#指定输出某行,选项-n
sed -n '2p' passwd2
bin x 1 1 bin /bin /sbin/nologin 

②删除——d

sed '2,4d' passwd2

删除2和4行并显示全部

③追加、插入

行后追加一行——a

sed '2a hello' student.txt

行前追加一行——i

sed '2i hello' student.txt

 如果要插入或者追加多行数据(就是说要插入的字符串是一个多行字符串)

④整行替换——c

sed '2c No data' passwd2

⑤字符串替换(部分替换)——s

sed 's/旧串/新串/g' 文件名
sed '行范围s/旧串/新串/g' 文件名

替换的格式与vim类似

例如,我要把前十行的bin全部替换为nib:

[root@rhel1 ~]# head -n 10 passwd2
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 '1,10s/bin/nib/g' passwd2
root x
0 0 root /root /nib/bash nib x 1 1 nib /nib /snib/nologin daemon x 2 2 daemon /snib /snib/nologin adm x 3 4 adm /var/adm /snib/nologin lp x 4 7 lp /var/spool/lpd /snib/nologin sync x 5 0 sync /snib /nib/sync shutdown x 6 0 shutdown /snib /snib/shutdown halt x 7 0 halt /snib /snib/halt mail x 8 12 mail /var/spool/mail /snib/nologin operator x 11 0 operator /root /snib/nologin

支持一次替换多个,在一个''中,写两个用;分隔的替换规则:

sed -e 's/bin/nib/g ; s/nologin/login/g' passwd2

支持正则,例如:把第二行注释掉

sed '2s/^/#/g' student.txt
#这里使用正则表达式,“^”代表行首

 

⑤修改文件内容——指令i(区别于插入的动作i)

sed -i '2c No data' passwd2