cat file
**********************************************************
Host:bronzewing1
Operating System:WinXP
Machine Type:Windows
Host Type:Client
Version:6.5.5
**********************************************************
Host:bronzewing2
Operating System:WinXP
Machine Type:Windows
Host Type:Client
Version:6.5.5
**********************************************************
要求把段落内的内容合并成一行:
Host:bronzewing1 Operating System:WinXP Machine Type:Windows Host Type:Client Version:6.5.5
Host:bronzewing2 Operating System:WinXP Machine Type:Windows Host Type:Client Version:6.5.5
- sed -n '/*/!{h;:1 n;/*/!{H;$!b1};z;x;s/\n/ /g;p}' file
[解析] 遇到星号的行不操作,然后把内容拷贝进 hold space 里,一直利用标签反复跳转,把内容 H 追加进 hold space 里,直到又再次遇见星号的行,然后 z 清空内容(把星号的行抹去),x 交换出 hold space 里的内容(就是先前追加的),替换成一行并打印。
- sed -n '/*/{g;s/\n/ /gp;n;h;b};H' file
[解析] 这是本文的重点,上个命令还是能出色的完成任务,但是要匹配两次星号,代码冗长了。换个思路,这个命令的思路是:遇到星号的行 g 把 hold space 里的内容替换到当前 pattern space 里的内容(就相当于抹除了星号的行),然后替换换行为空格,并打印,n 执行到下一行,然后用下一行的内容替换掉 hold space 里的前面的内容,如果不是星号的行就继续 H 追加。代码缩短了很多。
阅读(4662) | 评论(2) | 转发(0) |