所谓空行规则,指,默认的sed匹配模式空间里的空行,以 ^$ 表示 匹配空行
而当N读取一个空行到模式空间后,在模式空间里,以 \n 表示 空白行
默认,patt和hold空间里,都只有一个$符号,表示内容为空,即空行,和文本文件表示一样.
如,空文件a,5个空行如下:
[root@localhost ~]# cat a
[root@localhost ~]# cat -A a
$
$
$
$
$
[root@localhost ~]# sedsed -d 'N;N;N;N;N;N;N;N;N;N;N;N;$p' a
PATT:$
HOLD:$
COMM:N
PATT:\n$
HOLD:$
COMM:N
PATT:\n\n$
HOLD:$
COMM:N
PATT:\n\n\n$
HOLD:$
COMM:N
PATT:\n\n\n\n$
HOLD:$
解释:
四个\n,分割了5个空行,因为空行为空,所以什么都没有显示,只显示了分隔符\n
模式空间包含多行之后,正则表达式的^和$符号的意思就变了,^是匹配模式空间的最开始而非行首,$是匹配(或表示)模式空间的最后位置而非行尾。(最后位置标记符)
技巧:即看到 \n$ ,即表示模式空间里的最后位置必然是一个空行.(\n和$之间有一个空行,不显示,和文本文件里的空行,只有一个$符号一样,都不显示,也没有办法显示,空行能怎么显示出来?你可以直接理解为在模式空间里, \n$ 表示空行即可,事实就是的,因为\n为连接标记,$为最后位置标记,没有其他实际作用)
模式空间和暂存空间里的\n,只是一个多行连接的标记,能被正则匹配到(极重要),其他没有任何意义,不会被打印出来. 当多行被删除到剩一行(如D命令),此时\n连接标记符消失,只剩$符号.
如file文件内容如下:
[root@localhost ~]# cat file
##
xml
##
hello
#
#
2
[root@localhost ~]# sedsed -d '
/^#.*/{N;/^#.*\n$/D}' b
PATT:##$
HOLD:$
COMM:/^#.*/ {
COMM:N
PATT:##\nxml$
HOLD:$
COMM:/^#.*\n$/ D
PATT:##\nxml$
HOLD:$
COMM:}
PATT:##\nxml$
HOLD:$
##
xml
PATT:$
HOLD:$
COMM:/^#.*/ {
PATT:$
HOLD:$
PATT:##$
HOLD:$
COMM:/^#.*/ {
COMM:N
PATT:##\n$
HOLD:$
COMM:/^#.*\n$/ D
PATT:$
HOLD:$
COMM:/^#.*/ {
PATT:$
HOLD:$
PATT:hello$
HOLD:$
COMM:/^#.*/ {
PATT:hello$
HOLD:$
hello
PATT:$
HOLD:$
COMM:/^#.*/ {
PATT:$
HOLD:$
PATT:#$
HOLD:$
COMM:/^#.*/ {
COMM:N
PATT:#\n$
HOLD:$
COMM:/^#.*\n$/ D
PATT:$
HOLD:$
COMM:/^#.*/ {
PATT:$
HOLD:$
PATT:$
HOLD:$
COMM:/^#.*/ {
PATT:$
HOLD:$
PATT:$
HOLD:$
COMM:/^#.*/ {
PATT:$
HOLD:$
PATT:#$
HOLD:$
COMM:/^#.*/ {
COMM:N
PATT:#\n2$
HOLD:$
COMM:/^#.*\n$/ D
PATT:#\n2$
HOLD:$
COMM:}
PATT:#\n2$
HOLD:$
#
2