Shell脚本之sed详解
一, 基本概述
(1)基本介绍
sed是一款流编辑工具,用来对文本进行过滤与替换工作, sed通过输入读取文件内容,但一次仅读取一行内容进行某些指令处理后输出,sed更适合于处理大数据文件。
(2)工作原理
sed在处理文本文件的时候,会在内存上创建一个模式空间,然后把这个文件的每一行调入模式空间用相应的命令处理,处理完输出;接着处理下一行,直到最后。
(3)与vim的区别
vim需要通知处理文件的哪几行才会去处理,sed默认会处理文件的所有行,除非你告诉它不处理哪几行。
二, sed的基本语法
(1)sed [选项] [定址commands] [inputfile]
关于定址:
定址可以是0个、1个、2个;通知sed去处理文件的哪几行。
0个:没有定址,处理文件的所有行
1个:行号,处理行号所在位置的行
2个:行号、正则表达式,处理被行号或正则表达式包起来的行
(2)
选项:
--version 显示sed版本hao
--help 显示帮助文档
-n 关闭默认输出,默认将自动打印所有行
-e 多点编辑,允许多个脚本指令被执行。
-r 支持扩展正则+ ? () {} |
-i 可以修改原文件,慎用!
-f 支持使用脚本
命令:
p打印行
d 删除行
s 替换
n替换第几个匹内容
w另存为
a 之后添加一行
i 当前行之前插入文本
y 替换匹配内容
三, 实际案例讲解
(1)p(与-n合用)
查看passwd文件的1~3行
@1,打印一到三行
[root@tx3 ~]# cp /etc/passwd /t1
[root@tx3 ~]# cat -n t1 | sed -n '1,3p'
1root:x:0:0:root:/root:/bin/bash
2bin:x:1:1:bin:/bin:/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/sbin/nologin
@2,查看passwd文件的lp~halt行
[root@tx3 ~]# cat -n t1 |sed -n '/lp/,/halt/p'
5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
@3, 打印基数行(从第一行开始,每隔一行一输出)
@4,打印uid是0或1的行
[root@tx3 ~]# sed -n '/x:[01]:/p' t1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(2)d 删除
@1,删除第一行
@2,删除第一行和第三行(与-e选项合用)
@3,;选项的使用和-e一样
@4,取反:!
[root@tx3 ~]# cat -n t1 | sed '1!d'
1root:x:0:0:root:/root:/bin/bash
(3)s 查找替换 s///
语法:
'[address]s/pattern/replacement/flags'
old new
flags:
n:1-512 之间的正整数,表示替换模式里面出现的第几次内容
p:打印
g:全局修改
w:另存为
这几个选项是可以复合使用的,但是写的要有意义。(pg ;nw)
注:这里为部分截取
@1默认会替换行里面的第1个匹配
[root@tx3 ~]# sed 's/root/ROOT/' t1
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@2全部替换
[root@tx3 ~]# sed 's/root/ROOT/g' t1
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@3替换第2个匹配
[root@tx3 ~]# sed 's/root/ROOT/2' t1
root:x:0:0:ROOT:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
@4打印
[root@tx3 ~]# sed 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
ROOT:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin‘
[root@tx3 ~]# sed -n 's/root/ROOT/p' t1
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@5另存为
[root@tx3 ~]# sed -n 's/root/ROOT/w /tx' t1
[root@tx3 ~]# cat /tx
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
@6在文件的每行前面添加 # 注释
[root@tx3 ~]# sed 's/^/#/' t1
#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删掉文件的第1个字符
[root@tx3 ~]# sed 's/^.//1' t1
oot:x:0:0:root:/root:/bin/bash
in:x:1:1:bin:/bin:/sbin/nologin
aemon:x:2:2:daemon:/sbin:/sbin/nologin
@8删掉文件的第2个字符
[root@tx3 ~]# sed 's/.//2' t1
rot:x:0:0:root:/root:/bin/bash
bn:x:1:1:bin:/bin:/sbin/nologin
(4)i 从当前行插入
在第一行前插入hello
[root@tx3 ~]# sed '1i hello' t1
hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
(5)a 从当前行后添加
在第一行后添加hello
[root@tx3 ~]# sed '1a hello' t1
root:x:0:0:root:/root:/bin/bash
hello
bin:x:1:1:bin:/bin:/sbin/nologin
(6)-r 支持扩展正则
[root@tx3 ~]# sed -r 's/^(.)(.)/\1/' t1
rot:x:0:0:root:/root:/bin/bash //相当于把前两个字符替换成第一个字符,这样就实现了删除第二个字符
bn:x:1:1:bin:/bin:/sbin/nologin
demon:x:2:2:daemon:/sbin:/sbin/nologin
其他方法:
@1#sed 's/.//2' t1
@2#sed 's/^\(.\)\(.\)/\1/' t1
(7)y 替换,按照位置来匹配替换 y/// 不识别re
[root@tx3 ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' t1
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
(8)替换匹配行
@1[root@tx3 ~]# sed -n '1c ROOT' t1
ROOT
(9)q 退出
[root@tx3 ~]# sed '1q ' t1
root:x:0:0:root:/root:/bin/bash
(10)-i 可以修改原文件
(11)-f 支持脚本
四.sed如何处理数据
PATT:模式空间,处理文件的输入行,处理文件的空间,最多保存8192字节,相当于车间sed把流内容在这里处理。
HOLD:保留空间,用来保存已经处理的输入行;最多保存8192字节;默认有一个空行,相当于仓库,加工的半成品在这里临时储存。
COMM:命令
h:将模式空间里的内容,复制到保留空间里,覆盖原来的内容 >
H:将模式空间里的内容,追加到保留空间里,保留原来的内容 >>
g:将保留空间里的内容,复制到模式空间里,覆盖原来的内容
G:将保留空间里的内容,追加到模式空间里,保留原来的内容
n:对匹配行的下一行进行处理
x:交换模式空间和保留空间的内容
(1)h;G
@1.将第一行的内容放到打三行后面
@2.在每行的后面添加1个空行
注:1.保留空间里默认有一个空白行。2,‘G’默认处理全局
@3.把第1行到第4行的数据复制到第5行后面
注:1h是为了覆盖保留空间里的空白行
@4. 把第1行到第4行的数据剪切到第5行后面
(2)n 对匹配行的下一行进行处理
(3)x 交换模式空间和保留空间的内容