shell(1):sed
学习自: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