我有一个包含我想要摆脱的标题的文件。我没有很好的方法来解决标题的最后一行或数据的第一行,但我可以通过正则表达式在标题的倒数第二行之前解决该行。
输入示例:
a bunch of make output which I don't care about
for junk in blah; do
can't check for done!
done
for test in blurfl; do # this is the addressable line
more garbage
done
line 1
line 2
line 3
line 4
line 5
我已经完成了明显的1,/for test in blurfl/d
,但这并没有得到接下来的两行。我可以使命令{N;d}
摆脱下一行,但{N;N;d}
只是吹走了除最后一行之外的其余文件,我发现这是因为范围没有被哄骗并被视为单个实体,但是而是逐行处理。
我觉得我错过了一些明显的东西,因为我不知道一些sed习语,但网上或GNU手册中的所有例子都没有设法触发任何有用的东西。
我可以用awk做到这一点,但我需要做的其他转换有点尴尬,尴尬。但是GNU sed是可以接受的。
我不同意[不]使用awk
。在awk
中,任何非平凡的事情都比sed
更容易[甚至sed
手册页也是如此]。就个人而言,我会使用perl
,但......
所以,这是awk
脚本:
BEGIN {
phase = 0
}
# initial match -- find second loop
phase == 0 {
if ($0 ~ /for test in blurfl/) {
phase = 1
next
}
}
# wait for end of second loop
phase == 1 {
if ($0 ~ /done/) {
phase = 2
next
}
}
# print phase
phase == 2 {
print($0)
}
如果你想折磨你自己[和sed
]的复杂变化,那么请注意,但不要说我没有警告你......
我不认为你可以在sed做多行匹配。我第一次走下这个兔子洞后,我最终使用了awk,它可以支持,但是现在最近我可能会使用Python或Ruby来做这种事情。