使用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可以合并。我不想工作。我做错了什么,我理解?应该怎么样?
答案 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调用打印的行。