0606:
多行删除
d删除模式空间内容,导致读入新行
D删除模式空间第一行(直到第一个被嵌入的换行符)重点:它不会读入新行,相反它返回到脚本的顶端,将这些指令应用于模式空间剩余的内容!
P打印模式空间的第一行,用法见sed学习笔记-2的多行模式替换
例:保留一个空行
[root@localhost upload]# cat 1
a
b
c
d
e
[root@localhost upload]# cat 1.sed
/^$/ {
N
/^\n$/D
}
[root@localhost upload]# sed -f 1.sed 1
a
b
c
d
e
保持空间:
h复制模式空间内容到保持空间 覆盖
H复制模式空间内容到保持空间 追加
g复制保持空间内容到模式空间 覆盖
G复制保持空间内容到模式空间 追加
x交换两个空间的内容
例1:
[root@localhost upload]# cat 1
aaaaaaaaaaa
bbbbbbbbbbbbb
cccccccccccc
dddddddddddddd
eeeeeeeeeeeeee
ffffffffffff
[root@localhost upload]# cat 1.sed
#本脚本中对于空行的操作一定要在脚本的顶部
$ {
/^$/! {
H
s/.*//
}
}
/^$/! {
H
d
}
/^$/ {
x
s/^\n/<p>/
s/$/<\/p>/
}
[root@localhost upload]# sed -f 1.sed 1
<p>aaaaaaaaaaa
bbbbbbbbbbbbb
cccccccccccc</p>
<p>dddddddddddddd
eeeeeeeeeeeeee</p>
<p>ffffffffffff</p>
--------------------------------------------------------------------
流程控制命令:
b
1、"b<空格>标签" 跳转到指定标签下的语句(冒号开头的标签)
2、"b不代标签参数" 跳转到脚本结尾(不执行脚本剩下语句)
t
1、"t<空格>标签"如果上一个语句成功执行,则执行指定标签下的语句
2、"t不代标签参数" 跳转到文件结尾(不执行脚本剩下语句)
例:随便一个过程
:begin
s/a/A/
/a/b begin
/B/
t end
b
:end
D
-------------
n和N不打使执行权限回到顶部,而是只是单纯的读取下一行、追加下一行到当前的模式空间,从下一个命令接着处理。
2.txt
[root@centos-6 bak]# sed -f 2.sed -n 2.txt
ccc
aaaa
cccc
aaac
N
[root@centos-6 bak]# cat 2.sed
#!/bin/sed -f
/c/ {
s/a/A/g
:notfindpath
N
p
}
n
[root@centos-6 bak]# sed -f 2.sed -n 2.txt
aaaa
aaac
补充:只替换(也可以是追加)第一次出现的行
[root@localhost ~]# cat a.txt
1
2
3
123
111
123
222
[root@localhost ~]# ./1.sed -i a.txt
[root@localhost ~]# cat a.txt
1
2
3
123
AAA;
111
123
222
[root@localhost ~]# cat 1.sed
#!/usr/bin/sed -f
/123/ {
s/123/123\n AAA;/
:toend
$! {
N
b toend
}
}
[root@localhost ~]#