原理
帮助参考网站:http://www.gnu.org/software/sed/manual/sed.html
用法
格式:
sed [option]... ‘script;script;…’ [inputfile]
inputfile:可省略,sed作为标准输入,以自己的语法格式做处理
选项:
-n 不输出至屏幕上禁止自动打印
-i.bak 备份文件为file.bak,并修改原文件,不加.bak会直接修改原文件
-f FILE 从指定文件中读取编辑脚本
-r ;-E 使用扩展的正则表达式
-s 将多个文件视为独立文件,而不是单个连续的长文件流
script格式:
‘地址和命令’
地址格式:
(1) 不给地址:对全文进行处理
(2) 单地址:
#:指定的行,$:最后的行
/pattern/:被模式所能匹配到的行
(3) 地址范围:
#,#:从#行到#行
#,+#:从#到+#行
/pat1/,/pat2/:
/pat1/,#
(4) 步进:~
1~2:奇数行
2~2:偶数行
命令格式:
p 打印
Ip 忽略大小写
d 删除
a TEXT 在地址匹配到的当前行追加TEXT内容
i TEXT 在地址匹配到的当前行前面插入TEXT内容
c TEXT 在地址匹配到的当前行替换插入TEXT内容
w filename 保存模式匹配的行至指定文件中
r filename 读取指定文件的文本追加至地址匹配到的行后面
! 匹配行取反
q 结束或退出sed
范例:
1、打印指定行,取消自动打印
[root@rocky ~]#seq 10 | sed '2p'
1
2
2
3
4
5
6
7
8
9
10
[root@rocky ~]#seq 10 | sed -n '2p'
2
[root@rocky ~]#seq 10 | sed -n '2,6p'
2
3
4
5
6
[root@rocky ~]#seq 10 | sed -n '5,$p'
5
6
7
8
9
10
2、删除某行或范围行
[root@rocky ~]#seq 10 | sed '5,$d'
1
2
3
4
3、打印某文件非#开头的行
[root@rocky ~]#sed -n '/^[^#]/p' /etc/profile
[root@rocky ~]#sed '/^#/d' /etc/profile
4、打印奇数行
[root@Rocky8 ~]# seq 10 |sed -n '1~2p'
=[root@Rocky8 ~]# seq 10 |sed -n '2~2!p'
=[root@Rocky8 ~]# seq 10 |sed '2~2d'
1
3
5
7
9
5、打印偶数行
[root@Rocky8 ~]# seq 10 |sed -n '2~2p'
=[root@Rocky8 ~]# seq 10 |sed -n '1~2!p'
=[root@Rocky8 ~]# seq 10 |sed '1~2d'
2
4
6
8
10
6、在某行的下一行追加内容 a
[root@rocky ~]#seq 5 | sed '2~2ahello'
1
2
hello
3
4
hello
5
7、将某行保存在文件中 #w
[root@Rocky8 ~]# seq 10 | sed '3w /root/a.txt'
1
2
3
4
[root@Rocky8 ~]# cat a.txt
3
8、在指定行后追加内容 r file
[root@Rocky8 ~]# seq 10 |sed '1~2r /etc/issue'
1
\S
Kernel \r on an \m
2
3
\S
Kernel \r on an \m
4
5
\S
Kernel \r on an \m
查找替换
s/pattern/string/修饰符 分割符可替换为:s@@@;s###
修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I;i 忽略大小写
分组反向调用
\1,\2,…
范例
[root@Rocky8 ~]# echo 123456789 |sed -n -r 's/(123)(456)(789)/\2\1\3/gp'
456123789
[root@Rocky8 ~]# echo 123456789 |sed -n -r 's/(123)(456)(789)/\1\3/gp'
123789
[root@Rocky8 ~]# echo 123456789 |sed -n -r 's/(123)(456)(789)/\1abc\3/gp'
123abc789
提取IP地址
[root@rocky ~]#ifconfig eth0 | sed -n -r '2s/^.*inet +([0-9.]+) netmask.*$/\1/p'
10.0.0.18
修改网卡名称
[root@rocky ~]#sed -i -r '/GRUB_CMDLINE_LINUX=/ s#(.*)"$#\1 ifnames=0"#' /etc/default/grub
[root@rocky ~]#sed -i -r '/GRUB_CMDLINE_LINUX=/ s#"$# ifnames=0"#' /etc/default/grub
标签:10,rocky,seq,sed,root,Rocky8 From: https://www.cnblogs.com/Lx-learner/p/17047892.html