系列文章目录
第一章 正则表达式,一张表教你学会
第二章 Linux之awk的进阶使用
第三章 Linux之sed命令的基本使用
第四章 Linux之grep、egrep命令(文本三剑客完)
sed 替换、删除
sed 非交互式流编辑器 --stream editor
格式:sed [options] 'command' file
常用选项
-i:直接对原文件进行操作
-r:支持扩展正则表达式
-n:只显示匹配处理的行
-e:执行多个编辑命令时(一般用;代替)
-f:执行脚本文件中的命令,脚本文件中一行一条命令
常用编辑命令
p:打印匹配行 --print 1,5p:输出1到5行;$p:最后1行;3,5!p:取反输出除3~5行之外的行;2~3p,每隔3行取2行
d:删除指定行 --delete
[root@localhost 76]# cat fan.txt
wo ai chi fan ming
liu ming liu ming
[root@localhost 76]# sed -i '/liu ming/d' fan.txt
[root@localhost 76]# cat fan.txt
wo ai chi fan ming
a:在匹配行后面追加 --append
i:在匹配行前面插入 --insert
[root@localhost 76]# sed -i '1i zhaojunjie wangshenghu zhengyang' fan.txt # a是在下面插入一行,i是在上面插入一行
[root@localhost 76]# cat fan.txt
zhaojunjie wangshenghu zhengyang
wo ai chi fan ming
shenjiemi
c:整行替换, 70c 第70行 ; /cs/c 包含cs的行
[root@localhost 76]# cat fan.txt
zhaojunjie
chenxiongwei zhouyiwei
[root@localhost 76]# sed -i '2c liuchang zhangchang' fan.txt
[root@localhost 76]# cat fan.txt
zhaojunjie
liuchang zhangchang
s:字符串替换(匹配正则表达式) --substitution
s命令的格式是 s/regexp/replacement/flags ,其中:
- regexp 是一个正则表达式,用于匹配模式空间中的文本。
- replacement 是一个替换字符串,用于替换匹配到的文本。
- flags 是一些选项,用于控制替换的行为。
replacement中可以使用&来表示匹配到的字符,常常用于模糊匹配
: echo "i am fat ,i have a cat" | sed 's/.at/"&"/g'
i am "fat" ,i have a "cat"
也可以使用"\+数字"的方式表示具体的匹配分组,搭配"()"分组来进行使用
: echo aaa bbb ccc | sed -r 's/([a-z]+) ([a-z]+) ([a-z]+)/\3 \2 \1/'
ccc bbb aaa
开头插入,结尾追加可以用分别用 ^ $ 表示
: cat test.txt
xw 123
xw 222
clb 444
: sed -i '1,2 s/^/#/' test.txt
: cat test.txt
#xw 123
#xw 222
clb 444
: sed -i '1,2 s/$/hello/' test.txt
: cat test.txt
#xw 123hello
#xw 222hello
clb 444
s命令的flags有以下几种:
数字:表示将匹配到的第n个数字进行替换
g:表示全局替换,即替换每一行中所有匹配到的文本。 --global
ng:表示包括第n个之后的都替换
p:表示打印替换后的行,通常和-n选项配合使用。
w file:表示把替换后的行写入到文件file中。
i:表示忽略大小写,即匹配时不区分大小写。
m:表示多行模式,即允许正则表达式匹配多行文本。
当需要匹配的内容包含/时,可以选择用其他字符作为分隔符
: sed -n '/mengmeng/ s#/bin/bash#/sbin/nologin#' passwd
N:读取下一行到pattern空间,用于对多行同时进行操作
1.自己编辑一个文件test.txt,内容如下:
0.0.0.0
1.1.1.1
2.2.2.2
输出以下形式:
0.0.0.0:80,1.1.1.1:80,2.2.2.2:80
[root@localhost 76]# sed -i 'N;N;s/\n/:80,/g;s/$/:80/' test.txt # 后一个s命令用来补充最后一行的:80
=:输出行号
r:将文件的内容读入 --read
sed '$r xw.txt' ly.txt # 将xw.txt文件的内容追加到ly文件的末尾
w:将文本写入文件 --write
sed '1w xw.txt' ly.txt # 将ly.txt文件第1行的内容写到xw.txt文件,会覆盖xw.txt文件原本的内容
例:替换,将以 fan 开头的行中的所有 fan 替换为 liu
[root@localhost 76]# cat fan.txt
wo ai chi fan ming you
fan ming you fan ming you
[root@localhost 76]# sed -i '/^fan/ s/fan/liu/g' fan.txt
[root@localhost 76]# cat fan.txt
wo ai chi fan ming you
liu ming you liu ming you
例:删除,将所有的 you 删除
[root@localhost 76]# sed -i 's/you//g' fan.txt
[root@localhost 76]# cat fan.txt
wo ai chi fan ming
liu ming liu ming
练习
不要直接对下面的源文件进行操作,建议复制到当前文件夹里进行
1.sed取出/etc/passwd文件的第一列
sed -n '1p' /etc/passwd
2.sed将PATH环境变量中的冒号换成换行 ->可以将PATH变量的内容重定向到一个文件里,例如path.txt
sed 's/:/\n/g' path.txt
3.sed将PATH环境变量斜杠/换成斜杠\
sed 's/\//\\/g' path.txt
4.sed修改SELINUX配置文件从开启(enforcing)变成禁用(disabled)
/etc/sysconfig/selinux
sed -n '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux
5.去掉/etc/passwd文件中第二个字段的x
sed -r 's/^(.*:)x/\1/' /etc/passwd
6.将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=no修改为yes或者修改下IPADDR后面的ip地址,具体ip自己定义
cat /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -rn '/^ONBOOT=/ s/no/yes/p;/^DEFROUTE=/ s/yes/no/p'
7.只显示ip add的ip地址
ip add | sed -nr '/inet /s/.*inet ([0-9.]+).*/\1/p' # 得到所有的IP地址
ip add | sed -nr '/inet /s/.*inet ([0-9.]+).*ens33$/\1/p' # 得到ens33网卡的IP地址
ip add| sed -nr 's/(^.*inet) (([0-9][0-9]?[0-9]?.){3}[0-9][0-9]?[0-9]?).*(ens33$)/\2/p' # 低级写法
8.复制/etc/ssh/sshd_config到当前目录下,修改里面的端口号修改为8899
将#Port 22 配置修改为Port 8899 要求去掉前面的#号,将22修改为8899
egrep 'Port 22' /etc/ssh/sshd_config|sed 's/^#//;s/22/8899/'
9.给下列含有大写字母的行,在大写字母后追加数字2022 --》sed
abcdSdddde
islHishbxld
goBkefji
daanshXxge
sed '/[A-Z]/s/[A-Z]/&2022/' tpm.txt