sed 命令详细解析及应用

1.sed(流编辑器)

sed是一种流编辑器,它是文本处理中常用的工具。

1.1 命令格式:

sed   [选项]     '地址定界 动作'    file_name 

1.2 常用选项:

-e:承接多个筛选条件
-n,--quiet,--silent: 只显示匹配处理的行(sed默认输出所有文本内容)
-i: 直接原文内容
-p:打印

1.2.1 常用选项练习

理解-n和-p选项的用法:
创建a.txt文件,文件内容如下:

[root@centos6 ~]# cat a.txt
asdf;1324;fdsag
1234567890
qwer
asdasdsadasdasdas
1)执行命令
sed 's/1324/aaaa/' a.txt > b.txt

查看 b.txt 文件内容

[root@centos6 ~]# cat b.txt
asdf;aaaa;fdsag
1234567890
qwer
asdasdsadasdasdas

sed 默认输出所有文件内容,加上命令行中的替换,那么输出结果就是上面这样

2) 执行命令:
  sed 's/1324/aaaa/p' a.txt > b.txt 

查看b.txt文件内容

[root@centos6 ~]# cat b.txt
asdf;aaaa;fdsag
asdf;aaaa;fdsag
1234567890
qwer
asdasdsadasdasdas

上面运行结果的意思就是:首先sed默认输出文件全部内容,然后p又将匹配到的内容打印了一遍,也就是会输出两遍匹配到的内容

3) 执行命令:
sed -n 's/1324/aaaa/p' a.txt > b.txt

查看b.txt文件内容

[root@centos6 ~]# cat b.txt
asdf;aaaa;fdsag

上面运行的结果就是 -n屏蔽默认输出,然后s替换,p再将匹配到的内容打印出来,所以只显示了一行,也就是匹配到的那一行

4) 执行命令:
sed -n 's/1324/aaaa/' a.txt > b.txt

查看b.txt文件内容,内容为空

[root@centos6 ~]# cat b.txt
[root@centos6 ~]# 

这行就是sed -n选项屏蔽默认输出,s替换,但是没有p就不会将匹配到的内容输出

5) -e的用法:

编写文件 num.txt
文件内容如下:

[root@host-134 ~]# cat num.txt 
11
22
33
44
55

将num.txt中的11替换成22, 55替换成99.
命令:

[root@host-134 ~]# sed -e 's/11/22/' -e 's/55/99/' num.txt 
22
22
33
44
99

1.3 定址:

1.3.1 通过定址来定位希望编辑的行。

该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。也可通过模式来确定,或行号和模式的结合

例:
x                             x为行号,如1
x,y                           表范围,如2,5表示25/pattern/                     匹配到此模式的行
/pattern/,/pattern/           包含两个模式的行
x,/pattern/                   通过行号或模式定位
$                             最后一行

1.3.2 示例:

空地址

1)对全文就行处理

g是全局替换(s)

[root@master ~]# sed  's/root/ROOT/g' /etc/passwd
2)从第三次开始替换
[root@master ~]# echo "sksksksksksk" | sed 's/sk/SK/3g'
skskSKSKSKSK
3)将所有已mysql开头的内容替换为mysql_wg007 (&符号表示被匹配字符)
[root@master ~]# sed 's/^mysql/&_wg007/' /tmp/passwd
4)删除空行(d)
sed '/^$/d' /tmp/passwd

单地址

5)打印第二行的内容
[root@master ~]# sed -n '2p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
6)删除第一行的内容
[root@master ~]# sed '1d' /tmp/passwd

地址范围:

7)输出1-3行的内容
[root@master ~]# sed -n '1,3p' /tmp/passwd
#root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
7)输出第三行及后面的3行
[root@master ~]# sed -n '3,+3p' /tmp/passwd
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
8)删除1-3行的内容
[root@master ~]# sed '1,3d' /tmp/passwd

步进地址表示法:

9)打印奇数行
[root@master ~]# sed -n '1~2p' /tmp/passwd
10)打印偶数行
[root@master ~]# sed -n '2~2p' /tmp/passwd

1.4 常用动作:

常用动作/命令:

s : 替换
a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(匹配行的下一行)
c :替换行,将匹配的行替换为指定字符“test”
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(匹配行的上一行);
p :打印,即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行
w :将模式空间匹配到的行,写入指定文件中
r :将PATH中指定的文件写入匹配到的行下方,多用于文件合并。
= :显示行号
! : 条件取反,一般用于模式之后,命令之前

1.4.1 a:追加

1) 在以root开头的行号后面新增一行字符“123”
[root@master ~]# sed  '/^root/a "123"' /tmp/passwd
2) 在第一行后面新增字符"hello"
[root@master ~]# sed '1a "hello"' /etc/passwd

1.4.2 i:插入

1) 在第三行的前面插入字符 “hello”
[root@host-135 ~]#  sed '3i "hello"' /etc/passwd
2) 在以lp开头的行前插入"hello"
[root@master ~]# sed '/^lp/i "hello"' /etc/passwd
3) 在以nologin结尾的行前插入一行
[root@master ~]# sed '/nologin$/i "hello"' /etc/passwd

1.4.3 c:整行替换

1) 当前行只要包含“”root“” 这个字符串,整行会被替换为"hello"
[root@master ~]# sed '/root/c "hello"' /etc/passwd
2) 将以 root 开头的替换为"hello"

[root@master ~]# sed -n ‘/^root/c “hello”’ /etc/passwd

1.4.4 w : 将模式空间匹配到的行,写入指定文件中

1) 将以root开头的行写入到result.txt文件
[root@host-135 ~]# sed -n '/^root/w result.txt' /etc/passwd
[root@host-135 ~]# cat result.txt 
root:x:0:0:root:/root:/bin/bash
2) 将1-3行写入到result文件
[root@host-135 ~]# sed  '1,3w result.txt' /etc/passwd
[root@host-135 ~]# cat result.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

1.4.5 r /PATH : 将PATH中指定的文件写入匹配到的行下方

多用于文件合并

1) 将result.txt 的内容写入到 以mysql开头并且以nologin结尾的行后面
[root@host-135 ~]# echo hello > result.txt 
[root@host-135 ~]# cat result.txt 
hello
[root@host-135 ~]# sed  '/^mysql.*nologin$/r result.txt' /etc/passwd

1.4.6 =:显示行号

1) 显示最后一行的行号
[root@host-135 ~]# sed -n '$=' /etc/passwd
22
2) 显示以ftp开头的行号
[root@host-135 ~]# sed -n '/^ftp.*nologin$/=' /etc/passwd
12

1.4.6 ! : 条件取反

除了root开头的都打印出来

[root@host-135 ~]# sed  '/^root/!p' /etc/passwd

整理大佬博客>> https://blog.csdn.net/zhangshaohuas/article/details/109009600

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值