用sed块切割并压制最后一行

时间:2016-05-08 10:49:58

标签: bash sed

# cat file 
LBL 434
any lines but not block start
...
LBL 75677
...
any
LBL 777
...
LBL 798
...

# sed -ne '/LBL 75677/,/LBL/p' file | head -n -1
LBL 75677
...
any
#

以上命令对我有好处,但我想知道: 我可以在没有head命令的情况下仅使用一个sed脚本来抑制最后一行吗?我知道sed的命令和控制流程(N P D b ...),但我现在还无法弄清楚。

@Cyrus,谢谢它工作正常,我知道它是如何工作再次感谢。 但我想找到不同的解决方案。 我尝试使用/LBL 75677/,/LBL/命令将块N的行放入sed的空间缓冲区中,并D从空间缓冲区中移除最后一行(这是新块的第一行)并打印所有空间缓冲区。有人可以做到吗。

2 个答案:

答案 0 :(得分:2)

脚本下方:

sed -n '/LBL 75677/{p;:loop;n;/LBL/!{p;b loop}}' file

可能是您正在寻找的。

:loop这是一个标签,b loop无条件跳转到该标签。

在这里,我们创建一个小循环并继续打印行,直到达到下一个 LBL

答案 1 :(得分:1)

sed用于单个行(s/old/new/)上的简单替换,即全部。对于其他任何你应该使用awk:

$ awk '/LBL/{f=0} /LBL 75677/{f=1} f' file
LBL 75677
...
any

除了比等效的sed脚本更简单,更清晰之外,上面的执行速度会更快(特别是如果你只需要一个记录输出,因此可以将/LBL/{f=0}更改为/LBL/{exit}),并且更多因为它可以在所有UNIX系统上的所有awks上按原样运行,并且如果/当你的需求发生变化时更容易增强(当处理超过s/old/new/的任何内容时,一个微小的需求变化通常意味着完全重写一个sed脚本)。

如果你在sed中使用除s,g和p(和-n)之外的任何构造,那么你使用的结构在20世纪70年代中期被发明时已经过时了,因此不再需要所有的神秘的符文执行简单的多线任务。

相关问题