cat file
123
abc
234
abc
bcd
xyz
efg
xyz
xyz
wih
要求取到第一个 abc 开头最后一个 xyz 结尾的内容:
abc
234
abc
bcd
xyz
efg
xyz
xyz
- sed -n '/abc/{p;:a;n;H;/xyz/{x;s/\n//p;z;h};ba}' file
[解析]
首先说明,用 /m/,/n/ 这样的地址对取内容是肯定不行的。这个语句的思路是匹配到 abc 的关键字后就一直 H 追加到 hold space 里,直到遇见 xyz 关键字(该行内容也是追加到缓冲区),然后 x 交换出先追加到缓冲区的内容,替换掉第一个换行符,打印,然后再用 z 把 pattern space 清空,h 这时候也等于是清空了 hold space 里的内容,然后跳转到标记处,继续 n 执行下一行, H 追加到 hold space 里,如果后面还有 xyz 关键字同样会继续刚才的操作,如果没有一直到末尾,就结束命令。 z 是 gun sed 的扩展,4.2.0版本后支持。
- awk '/abc/,0{i=i?i"\n"$0:$0}/xyz/{print i;i=""}' file
-
awk '/abc/{x=1}x{i=i?i"\n"$0:$0}/xyz/{print i;i=""}' file
[解析]
/abc/,0这个是取abc开始到最后的内容,跟第二个命令用一个变量开关是一个道理,用变量 i 来保存内容,遇到 xyz 关键自就打印出来,并清空变量i。
阅读(4262) | 评论(0) | 转发(1) |