sed
sed 维护了一个模式空间,另外维护了一个保持空间。
通常情况下,sed 将要处理的文件的一行读入模式空间,然后在模式空间里用脚本对其进行处理,处理完成之后打印模式空间的内容。并情况模式空间。然后再读入一行………………按此循环。
当在多行模式下,会使用到保持空间,用于与模式空间交互,并改变正常的流顺序,来达到复杂的处理。
sed 命令格式为
[address] command
address 可以用正则匹配,也可以直接制定行号
d 表示删除模式空间中所有的内容
g 表示全局
s 表示替换
p 打印模式空间中的内容
= 打印行号
r [file] 将file内容追加进模式空间
W [file] 将模式空间中的内容写进file
! 正则,表示取反
& 用正则匹配的内容进行替换
q 退出
追加 #在模式空间中追加内容
[line-address]a\
text
插入 #在模式空间之间插入内容
[line-address]i\
text
更改 #在一个范围行内用文本替换
[address]c\
text
转换 #在匹配内,用xyz转换abc,注意是单个字符
[address]y/abc/xyz
n 输出模式空间的内容,然后读入下一行进模式空间,而不用返回脚本的顶端
N 读取下一行,并将它追加到模式空间的现有内容之后建立多行模式空间,模式空间最初的内容和新的输入行之间用
换行符间隔。
N和n命令不同的是,n输出模式空间的内容,然后读取新的输入行,n不创建多行模式空间
D 删除模式空间中的第一行。并且返回到脚本的顶端,将这些指令应用于模式空间中剩余的内容。d 删除模式空间中所有的
内容,然后读取新的输入行,在脚本的顶端重新使用编辑方法。
P 打印模式空间中的第一行。
h 将模式空间的内容覆盖到保持空间。
H 将模式空间的内容追加到保持空间。
g 将保持空间的内容覆盖到模式空间。
G 将保持空间的内容追加到模式空间。
x 交换保持空间和模式空间的内容。
标签
b label ,无条件跳转到标签label,如果label没有指定,跳转到命令的结尾。
t label , 如果最后一次输入的最后一个s///命令执行成功,跳转到标签label,如果没有指定label,跳转到命令的结尾。
# cat test
a
a
a
a
a
a
a
a
a
将第2个a修改成b,并删除最后一个空行
# sed '0,/a/b;s/a/b/;ta;:b;/^$/d;:a;n;bb' test
a
b
a
a
a
a
a
a
a