2012-07-03 24 views
1

请考虑下面的例子:Grep - 具有独立上下文的复合语句?

$ echo -e "-wordA \n 1\n 2\n 3\n-wordB \n 1\n 2\n 3\n" | grep -n -A1 -e '^-wordA' -A2 -e '^-wordB' 
1:-wordA 
2- 1 
3- 2 
-- 
5:-wordB 
6- 1 
7- 2 

我想上面做的,就是有1号线的“上下文后”当行首-wordA比赛,和2号线的背景后,-wordB匹配时。显然,我的尝试是行不通的,因为在两场比赛中,我都会得到两行的上下文。

显然,以上下文中的最后一个设置为准,成为所有搜索的设置;但我只是想确保 - 可以使用grep进行这样的“复合”搜索与个人情况? (编辑:特别是,我的意思是通过调用grep单个实例来使用,可能避免临时文件)

非常感谢任何答案,
干杯!

回答

2

我不知道如何做到这一点与grep(1)。我相信我已经写了一个awk脚本,它可以做你想做的事情;试试这个:

$ echo -e "-wordA \n 1\n 2\n 3\n-wordB \n 1\n 2\n 3\n" | 
    awk '/^-wordA/ {print; getline; print;} 
     /^-wordB/ {print; getline; print; getline; print;}' 
-wordA 
1 
-wordB 
1 
2 
$ 

我已经任意地线包裹的易读性 - 当然,你需要做到这一点。

+0

感谢的是,@sarnold - 看起来不错!我会离开这个问题一段时间,看看是否会出现'grep'原生答案 - 否则这个答案对我来说看起来是可以接受的;非常感谢 - 欢呼! – sdaau

+0

这是一个很好的计划;我不知道如果'-wordA'和'-wordB'是背靠背的行,或者在另一个的打印空间内,这是否会做正确的事情。我认为'grep(1)'可以更好地处理它 - 如果它可以在'grep(1)'中完成 - 但如果不能,这应该是一个有价值的起点。 – sarnold

1

使用grep一个解决方案,假设没有输出1输出2文件在当前目录

echo -e "-wordA \n 1\n 2\n 3\n-wordB \n 1\n 2\n 3\n" | tee >(grep -n -A1 -e '^-wordA' >output1) >(grep -n -A2 -e '^-wordB' >output2) >/dev/null ; cat output1 output2 
+0

感谢你,@NahuelFouilleul--这个解决方案基本上调用了两个独立的'grep'实例,并使用临时文件结合它们的结果;我更感兴趣的是“本地”使用(暗示单个“grep”实例(单行),并且没有临时文件);现在编辑问题。再次感谢 - 欢呼! – sdaau