1

在匹配行之前使用 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 可以组合。我不想工作。我做错了什么,我明白了吗?应该怎么看?

4

3 回答 3

2

这可能对您有用(GNU sed):

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

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

于 2013-05-30T07:26:38.840 回答
0

期望的输出是什么?第一个命令给出一个单行aaa。第二个和第三个命令没有输出。行为差异有充分的理由。

在第一个命令中,您有:

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

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

在第二个和第三个命令(它们是等效的)中,你有:

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

第一个操作数删除不存在的每一行aaa并开始下一个循环。第二个操作数删除所有剩余aaa的,因为它们都不在输入的最后一行(输入的最后一行是ccc,由于 not 已经被删除aaa)。所以你看到的输出正是你所期望的。

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

grep '^aaa$' | uniq

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

echo aaa

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

于 2013-05-30T06:48:26.863 回答
0

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

于 2013-05-30T06:49:23.680 回答