03 sed脚本预览

一个SED程序由一个或多个SED命令组成,它们由一个或多个E,f,-表达式,和- file选项传递,或者第一个非选项参数。

3.1 sed命令汇总

a                                       追加文本
c\                                      替换行
d                                       删除模式空间,里面下一次循环
D                                       模式空间包含新行的时候,删除第一行,循环处理
e                                       执行命令并发送输出到输出流
F                                       打印当前文件名字
g                                       用hold空间去替换模式空间
G                                       追加新行到模式空间,然后追加内容到hold空间
h                                       用模式空间去替换hold空间
H                                       追加行到hold空间,然后追加模式空间到hold空间
i                                       插入文本
l                                       明确的格式打印模式空间
n                                       替换新行到模式空间
N                                       追加新行到模式空间
p                                       打印模式空间
P                                       打印模式空间+换行
q                                       退出,可以指定退出码
Q                                       退出,可以指定退出码
r                                       读取文件
R                                       当前处理周期结束,读取文件
s/regexp/replacement/[flags]            替换src模式为replacement的内容
v                                       版本
w                                       写入文件
W                                       写入到文件第一行
y/src/dst                               转化src模式到dst内容
z                                       清空模式空间内容
#                                       一个注释
{cmd1;cmd2}                             多个命令一起
=                                       打印当前行号

3.2 s命令汇总

s的命令是替换的。 基本用法是这样的。

s/regexp/replacement/flags

flags有以下几种

g                       全局替换,而不是仅仅第一个
number                  只匹配指定的个数
p                       打印出来
w                       写到文件中
I                       匹配正则的时候大小写不敏感
i                       匹配正则的时候大小写不敏感

3.3 经常使用的命令

3.3.1 #

#开头的作为注释

3.3.2 q [exit-code]

退出码,样例:

[root@centos74 ~]$ seq 3
1
2
3
[root@centos74 ~]$ seq 3 | sed 2q
1
2
[root@centos74 ~]$ echo $?
0

3.3.3 d

[root@centos74 ~]$ seq 3 | sed 2d
1
3

默认是打印所有行,2d删除了第二行的打印

3.3.4 p

[root@centos74 ~]$ seq 3 | sed -n 2p
2

-n取消了默认的打印,2p纸打印第二行

3.3.5 n

[root@centos74 ~]$ seq 6 | sed 'n;n;s/./x/'
1
2
x
4
5
x

这个稍有点复杂, n这个命令的意思上面提过了。 这里在说一次。 如果自动打印被禁用了。就打印模式空间,然后用新的行替换模式空间。

第一个n;就直接把第一行打印出来了。然后读取了第二行,第二个n;就把第二行打印出来了。然后读取了第三行,接下来是s替换命令,.匹配单个字符,修改为x。所以第三行的3匹配了这个正则,就被修改了。

3.4 使用较少的命令

3.4.1 y/source-chars/dest-chars/

这个命令和tr差不多的感觉。 就是对应位置替换的。

[root@centos74 ~]$ echo hello world | sed 'y/abcdefghij/0123456789/'
74llo worl3

3.4.2 a text

[root@centos74 ~]$ seq 3 | sed '2a hello'
1
2
hello
3

3.4.3 i text

[root@centos74 ~]$  seq 3 | sed '2i hello'
1
hello
2
3

3.4.4 c text

[root@centos74 ~]$ seq 10 | sed '2,9c hello'
1
hello
10

3.4.5 =

[root@centos74 ~]$ printf '%s\n' aaa bbb ccc
aaa
bbb
ccc
[root@centos74 ~]$ printf "%s\n" aaa bbb ccc | sed =
1
aaa
2
bbb
3
ccc

3.4.6 r filename

[root@centos74 ~]$ seq 3 | sed '2r/etc/hostname'
1
2
centos74.magedu.com
3

3.4.7 w filename

[root@centos74 ~]$ seq 3 |sed '2wa.txt'
1
2
3
[root@centos74 ~]$ cat a.txt
2

3.4.8 D

如果模式空间不包含换行符,如果D的命令发出正常的新周期的开始。否则,删除文本模式空间中的到第一个换行符,用所得的空间格局重新启动循环,没有阅读新的一行输入。

3.4.9 N

添加一个新行到模式空间,然后在下一行输入到模式空间。如果没有更多的输入,则SED退出而不处理任何命令。

3.4.10 p

打印出来的部分模式空间到第一个换行符

3.4.11 h

用模式空间的内容替换保持空间的内容。

3.4.12 H

添加一个新行的容纳空间的内容,然后将模式空间的内容,保留空间。

3.4.13 g

将模式空间的内容替换为保持空间的内容。

3.4.14 G

添加一个换行符对模式空间的内容,然后将占据空间的内容到模式空间。

3.4.15 x

交换保持和模式空间的内容。

3.5 多个命令一起

[root@centos74 ~]$ seq 6 | sed -e 1d -e 3d -e 5d
2
4
6
[root@centos74 ~]$ seq 6 | sed '1d;3d;5d'
2
4
6