|
一般情况下,sed 是“行”的流编辑器,有些时候,也有多行操作的需要。比如,可能希望将一个文本中的所有换行符去掉,你可能会想到使用下面的语句:但这么做的结果并不像想象那样,看起来似乎并不凑效。这是因为,当 sed 在处理每一行时,会将该行读入到 pattern space (这个概念可参考:http://www.groad.net/bbs/read.php?tid-6021.html),而其后的换行符不会被读入,所以这样像上面的做法,并不会起到消除换行的目的。
然而,sed 里的 N 命令可以用来读取文件中的下一行到 pattern space 中,被 N 命令所读入的行附加在前一行的后面,两行之间还添加了一个换行符以作分隔,相当于:
下面是一个供测试用的文本内容:# cat test.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)
Storage in Linux
Website Design
Website Design
Windows- Sysadmin, reboot etc. 上面的文本中,有两个连续的空行。
利用上面的这个文本,首先证明 sed 每次所读入的一行内容并不包含换行符(\n):# sed '{
N
s/\n/ @ /
}' test.txt
Linux Sysadmin @ Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc. @ Security (Firewall, Network, Online Security etc)
@
Storage in Linux @ Website Design
Website Design @ Windows- Sysadmin, reboot etc. 上面,花括号用来包含命令的组合,其中有两个命令,一个是 N 命令,用来读取下一行内容到 pattern space ;另一个是 s/\n/ @ / ,用来将换行符 \n 替换为 “ @ ” 。从输出的第一行(Linux Sysadmin @ Databases - Oracle, mySQL etc.)可以看到,"etc." 的后面并没有 “ @ ” 符号,也就是说被读入到 pattern space 中的 “Databases - Oracle, mySQL etc.” 这一行后并没有换行符,因此得出一个结论:通常,sed 读入到 pattern space 的一行内容并不包括换行符。所以,这也说明了为什么上面所说的 sed 's/\n//' filename 语句不能奏效的原因。
从上面的例子还可以看到两个空行被合并成了一行。
在《使用 = 命令打印行号 》里演示了用 = 命令来打印行号,我们这里也用来试试看:
# sed '/./=' test.txt
1
Linux Sysadmin
2
Databases - Oracle, mySQL etc.
3
Databases - Oracle, mySQL etc.
4
Security (Firewall, Network, Online Security etc)
7
Storage in Linux
8
Website Design
9
Website Design
10
Windows- Sysadmin, reboot etc. 上面 sed 命令中 /./ 表示匹配非空行。从输出的结果可以看到,行号和内容各为一行,这有时会让人觉得缺少美观,我们可能更希望看到下面的展现形式:1 Linux Sysadmin
2 Databases - Oracle, mySQL etc. 这里,我们同样可以利用 N 命令来实现,如:# sed '/./=' test.txt |sed 'N; s/\n/ /'
1 Linux Sysadmin
2 Databases - Oracle, mySQL etc.
3 Databases - Oracle, mySQL etc.
4 Security (Firewall, Network, Online Security etc)
7 Storage in Linux
8 Website Design
9 Website Design
10 Windows- Sysadmin, reboot etc. 现在排版变得美观了。
如果我们希望去除掉文本中的两个连续空行(多个连续空行也同样适用),那么可以如下使用:# sed '/^$/{N
/^\n$/d
}' test.txt
Linux Sysadmin
Databases - Oracle, mySQL etc.
Databases - Oracle, mySQL etc.
Security (Firewall, Network, Online Security etc)
Storage in Linux
Website Design
Website Design
Windows- Sysadmin, reboot etc. 上面命令中,^$ 表示空行,而 /^\n$/d 表示开头到末尾的中间只有一个换行符,而这个换行符是由 N 命令所添加,因此它表示两个空行。 |
|