# 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
从空间缓冲区中移除最后一行(这是新块的第一行)并打印所有空间缓冲区。有人可以做到吗。
答案 0 :(得分:2)
脚本下方:
sed -n '/LBL 75677/{p;:loop;n;/LBL/!{p;b loop}}' file
可能是您正在寻找的。 p>
: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年代中期被发明时已经过时了,因此不再需要所有的神秘的符文执行简单的多线任务。