1

请考虑以下示例:

$ 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。显然,我的尝试不起作用,因为在两场比赛中,我都得到了 2 行 after context。

显然,无论哪个是 after context 的最后一个设置,都会成为所有搜索的设置;但我只是想确定一下——是否有可能在grep个别上下文中使用这种“复合”搜索?(编辑:特别是,我的意思是通过调用单个实例来使用grep,可能避免临时文件)

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

4

2 回答 2

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
$ 

为了便于阅读,我已经任意换行了——当然,你需要让它完全适合。

于 2012-07-03T02:11:27.447 回答
1

一个grep的解决方案,假设当前目录下没有output1 output2文件

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
于 2012-07-03T12:32:47.463 回答