2013-05-30 47 views
1

前显示行使用的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。我不想工作。我做错了什么,我明白了吗?应该如何正确地看起来像?

回答

2

这可能为你工作(GNU SED):

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

抓住你必须将它保存在货舱空间,然后在文件的结尾检索它的最后一场比赛。

+0

谢谢。完美无缺。我知道你现在还不知道。我认为是“人”。 – user2435244

+0

@potong你写这蒙住眼睛,不是吗? +1 –

+0

当然@potong学会了sed。 指南帮助您了解sed: man sed http://www.grymoire.com/Unix/Sed.html http://www.catonmat.net/blog/wp-content/uploads/2008/09 /sed1line.txt 良好的tutoarial和很多可以学习。你必须照顾穷人。 – user2435244

0

什么是期望的输出?第一个命令给出一行aaa。第二个和第三个命令没有输出。造成这种行为差异的原因很可能。

在第一个命令,你必须:

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

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

在第二和第三个命令(其是等同的),您有:

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

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

如果你只想要一个aaa,可以考虑使用:

grep '^aaa$' | uniq 

虽然这是写的长篇大论方式:

echo aaa 

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

0

$地址表示最后一行。即使最后一行由于前一个命令而未被打印,它也不会改变。但是,在流水线中,只有打印的行才会进入sed的第二次调用,并且$再次表示最后一行 - 现在只能从先前的sed调用打印的行中执行。

+0

谢谢。 A可以是另一种方法来捕捉最后一行? – user2435244