sed:匹配前显示行

时间:2013-05-30 06:33:34

标签: regex linux bash sed

使用sed在匹配行之前查找最后一行:

echo -e "aaa\nbbb\nccc\naaa\nccc\naaa\nbbb\nccc" | sed '/aaa/!d' | sed '$!d' #In which order and amount of aaa, bb, ccc, ..., nnn is optional

上面的例子效果很好。第二种方法:

echo -e "aaa\nbbb\nccc\naaa\nccc\naaa\nbbb\nccc" | sed -e '/aaa/!d' -e '$!d'

或:

echo -e "aaa\nbbb\nccc\naaa\nccc\naaa\nbbb\nccc" | sed -e '/aaa/!d;$!d'

第二种方法不希望我工作。维基百科有人写道,sed可以合并。我不想工作。我做错了什么,我理解?应该怎么样?

3 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed '/aaa/h;$!d;x' file

要捕获最后一个匹配项,您必须将其存储在保留空间中,然后在文件末尾检索它。

答案 1 :(得分:0)

所需的输出是多少?第一个命令给出一行aaa。第二个和第三个命令不提供输出。这种行为存在差异,这是有充分理由的。

在第一个命令中,您有:

sed '/aaa/!d' | sed '$!d'

此处的第一个sed会删除不是aaa的每一行。然后过滤输出(包含aaa的3行),以便只打印最后一行。

在第二个和第三个命令(相当于)中,您有:

sed -e '/aaa/!d' -e '$!d'

第一个操作数删除不是aaa的每一行并开始下一个循环。第二个操作数删除每个剩余的aaa,因为它们都不在输入的最后一行(输入中的最后一行是ccc,由于不是{{1}而已被删除})。所以你看到的输出正是你应该期待的。

如果您只想要一个aaa,请考虑使用:

aaa

虽然这是一种冗长的写作方式:

grep '^aaa$' | uniq

据推测,这是真实情况的简化版本(这是一件好事)。

答案 2 :(得分:0)

地址中的

$表示最后一行。即使由于上一个命令而未打印最后一行,它也不会改变。但是,在管道中,只有打印的行进入sed的第二次调用,而$再次表示最后一行 - 现在仅来自前一个sed调用打印的行。