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

上記でやりたかったことは-wordA、行頭で一致する場合は「コンテキストの後」を 1 行、一致する場合はコンテキストの後を 2 行にすること-wordBです。明らかに、私の試みはうまくいきません。両方のマッチで、2 行のアフター コンテキストが得られるからです。

どうやら、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

現在のディレクトリにoutput1output2ファイルがないと仮定した場合のgrepを使用したソリューション

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 に答える