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 ~]#