如何删除正则表达式分隔范围加上几行sed?

问题描述 投票:0回答:2

我有一个包含我想要摆脱的标题的文件。我没有很好的方法来解决标题的最后一行或数据的第一行,但我可以通过正则表达式在标题的倒数第二行之前解决该行。

输入示例:

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是可以接受的。

sed
2个回答
2
投票

我不同意[不]使用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]的复杂变化,那么请注意,但不要说我没有警告你......


0
投票

我不认为你可以在sed做多行匹配。我第一次走下这个兔子洞后,我最终使用了awk,它可以支持,但是现在最近我可能会使用Python或Ruby来做这种事情。

© www.soinside.com 2019 - 2024. All rights reserved.