一.Sed定义
sed命令是将一系列的编辑命令应用于一批文本的理想工具。sed命令拥有非交互式和高效的特点,可以为用户节约大量的时间。本节将介绍sed命令的基础知识。
二.sed的基本语法
sed OPTIONS… '[
动作
]' [
文件名
]
常用的选项:
-n,–quiet:
不输出模式空间中的内容
-i:
直接编辑原文件,默认不对原文件进行操作
-e:
可以使用多个命令(脚本)进行操作
-f /path/from/sed_script:
以选项中指定的
script
文件来处理输入的文本文件。
-r:
使用扩展正则表达式
三.sed 地址定界
(1) # :#为数字,指定要进行处理操作的行 sed -n '2 p' /etc/passwd
(2) $:表示最后一行. sed -n '$ p' /etc/passwd
(3) /regexp/:表示能够被regexp匹配到的行 sed -n '/root/ p' /etc/passwd
regexp及基于正则表达式的匹配
/regexp/I:忽略大小写
(4) /regexp/:从起始行开始到第一次能够被regexp匹配到的行
sed -n '1,/bin/ p' /etc/passwd
(5) first~step:指定起始的位置及步长
sed -n '1~3 p' /etc/passwd
从第一行开始每隔3行显示一行内容
(6)
addr1,+N:指定行以及以后的N行
addr1,~N:指定行开始的N行
四.sed常用编辑命令
(1) d:删除匹配到的行
sed 'd' /etc/passwd 删除全部
sed '3d' /etc/passwd 删除第三行
sed '2,5d' /etc/passwd 删除第二行到第五行
sed '/1/,/3/d' /etc/passwd 删除一到三行
sed '3,$d' /etc/passwd 删除第三行到结束
(2) p : 打印模式空间中的内容
sed -n '1,3 p' /etc/passwd
(3) a \text: append,表示在匹配到的行之后追加内容
sed '/root/ a this is root ' /etc/passwd
(4)i \text: insert,表示在匹配到的行之前追加内容
sed '3i this is root' /etc/passwd
(5)c \text: change,表示把匹配到的行和给定的文本进行交换-----行替换
sed '3c this is text' /etc/passwd
(6)
s/regexp/text/flages
:查找替换
,
把
text
替换为
regexp
匹配到的内容
常用的flages有:
g
:全局替换,默认只替换第一个
i
: 不区分大小写
p
:如果成功替换则打印
例子:.对文本文件需要对里面的第十二行aaa字符串进行替换成bbb应该要怎么命令操作
sed '12s/aaa/bbb/p ' /text
(7)w 标记会将匹配后的结果保存到指定文件中
sed '12s/aaa/bbb/w test.txt ' /text
cat test.txt
bbb
五.sed扩展
特殊符号 介绍说明
!
对指定行意外的所有行应用命令
sed '3,$ ! d' /etc/passwd
=
打印当前行行号
sed -n '=' a.sh
&
代表被替换的内容
;
实现一行命令语句可以执行多条
sed
命令
1p;2p;5p
{}
对单个地址或范围执行批量操作
{
将多个规则,或者多个命令放在大括号通过;隔开
}
+
地址访问内用到的符号,做加法运算
-e
可以指定多个表达式
[root@localhost ~]# sed -n -e '1 s/root/ROOT/p' -e '2,3 p'
/etc/passwd
-n **
打印当前模式空间内容,然后读取下一行并替代当前模式空间的内容。如果读取不到下一行
sed
则会 不运行之后的命令 **
(读取指定行通过下一行覆盖该内容只对下一行进行处理)
-N **
读取下一行并且附加到当前模式空间内,如果读取不到下一行
sed
则会不运行之后的命令
**
(可以在
模式空间同时读取两行内容进行处理)
例题:
1
、把
/etc/passwd
复制到
/root/test.txt
,用
sed
打印所有行;
[root@172 ~]
# sed '1,$ w /root/test.txt' /etc/passwd
[root@172 ~]
# sed -n -e 'p' -e'w ./t1.txt' /etc/passwd
2
、打印
test.txt
的
3
到
10
行
;
[root@172 ~]
# sed -n '3,10p' test.txt
3
、打印
test.txt
中包含
’root’
的行;
[root@172 ~]
# sed -n '/root/p' test.txt
4
、删除
test.txt
的
15
行以及以后所有行;
[root@172 ~]
# sed '15,$d' test.txt
5
、删除
test.txt
中包含
’bash’
的行;
[root@172 ~]
# sed '/bash/d' test.txt
6
、替换
test.txt
中
’root’
为
’toor’
;
[root@172 ~]
# sed -n 's/root/toor/g p' test.txt
7
、替换
test.txt
中
’/sbin/nologin’
为
’/bin/login’
sed
's/\/sbin\/nologin/\/bin\/login/g'
test.txt
8
、删除
test.txt
中
5
到
10
行中所有的数字;
[root@172 ~]
# sed -nr '5,10 s/[0-9]+//g p' test.txt
[root@172 ~]
# sed -nr '5,10 s/[0-9]*//g p' test.txt
9
、删除
test.txt
中所有特殊字符(除了数字以及大小写字母);
[root@172 ~]
# sed -nr 's/[[:punct:]]//g p' test.txt
10
、在
test.txt
20
行到末行最前面加
’aaa:’
[root@172 ~]
# sed '20,$ i aaa:' test.txt
11
、删除
centos7
系统
/etc/grub2.cfg
文件中所有以空白开头的行行首的空白字符
[root@172 ~]
# sed 's/^[ ]*//' /etc/grub2.cfg
12
、删除
/etc/fstab
文件中所有以
'#'
开头,后面至少跟一个空白字符的行的行首的
'#'
和空白
字符
[root@172 ~]
# sed -r 's/^#[ ]//' /etc/fstab
13
、在
centos6
系统
/root/install.log
每一行行首增加
'#'
号
[root@centos6 ~]
# sed -n 's/^/#/p' install.log
[root@centos6 ~]
# sed -rn 's/(^.*)/#\1/p' install.log
14
、在
/etc/fstab
文件中不以
'#'
开头的行的行首增加
'#'
号
[root@172 ~]
# sed 's/^[^#]/#/' /etc/grub2.cfg
15
、处理
/etc/fstab
路径
,
使用
grep
和
sed
命令取出其目录名和基名
[root@centos7 data]
#echo /etc/fstab | sed -nr 's#(.*)/.*$#\1#p' /etc
[root@centos7 data]
#echo /etc/fstab | sed -nr 's#.*/([^/]+)/?$#\1#p'
fstab
16
、利用
sed
取出
ifconfig
命令中本机的
IPv4
地址
[root@172 ~]
# ifconfig |sed -nr '/inet / s/.*et (.*) ne.*/\1/ p'
17
、统计
centos
安装光盘中
Package
目录下的所有
rpm
文件的以
.
分隔倒数第二个字段的重复次
数
[root@172 ~]
# ls /mnt/BaseOS/Packages/ |sed -nr 's/.*el8\.(.*)\.rpm/\1/
p'