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