ANDパターンを介してファイルの内容を再帰的に検索し、ag / silver searcherなどの出力を印刷する方法は?

ANDパターンを介してファイルの内容を再帰的に検索し、ag / silver searcherなどの出力を印刷する方法は?

これは、例えば説明する方が簡単であろう。これは私の入力ファイルです。

file1:
x
x
a
b
c
x
x

file2:
x
x
c
b
a
x
x

file3:
x
x
x x a b c x x
x
x

file4:
x
x
x x c b a x x
x
x

file5:
x
x
a b
x
x

file6:
x
x
x x b c x x
x
x

file7:
x
x
x x b b x x
x
x

aregexp ANDを使用してファイルを検索したいですc。これによりファイル 1-4 が返されます。

ag -C <number> --pager="less -R" regexp出力が出力にできるだけ近いようにしたいと思います。以下は次のとおりです(色を強調表示するために結果を山かっこで囲みました)。

file1:
2: x
3: <a>
4: b
5: <c>
6: x

file2:
2: x
3: <c>
4: b
5: <a>
6: x

file3:
2: x
3: x x <a> b <c> x x
4: x

file4:
2: x
3: x x <c> b <a> x x
4: x

または、ag次のように印刷することもできます。

file1:
2: x
3: <a>
4: b
--
4: b
5: <c>
6: x

わかりませんが、その詳細は私にとって重要ではありません。これがすること:

  1. 最も明るい部分
  2. 上記のファイルの相対パス
  3. これらの機能はlessナビゲーションと検索を提供します。
  4. 複数の正規表現を見つけることができ、一緒に見つけることもできます。
  5. オプション-Cはまだコマンドラインにあります。

行番号は良いですが、必須ではありません。


私はたくさん試してみましたが、これは私が得た最も近いものです:

ステップ1:各正規表現のファイルリストをプリコンパイルします。

for x in $array_of_regexp_file_names; 
  do r=${x/.txt/} ; # remove .txt from the end
  ag -il $r | sort > $x & ; # sort the list of FILES with this single regexp
done

これは、ファイル名でソートされた各正規表現のファイルのリストを提供します。

ステップ2:agを使用して2つ以上のファイルリストが交差する部分を検索する

以下で分解させていただきます。

ag -C 1 --pager="less -R" "regexp1|regexp2" $(comm -12 regexp1.txt regexp2.txt)

$(comm -12 regexp1.txt regexp2.txt)

このコマンドは以下を探します。交差点2つのファイルのリスト。この写真の赤は次のとおりです。

ここに画像の説明を入力してください。

ag -C 1 --pager="less -R" "regexp1|regexp2" ...

agここに正規表現を提供しました。知るその交差点のすべてのファイルに存在します。重複しているように見えるかもしれませんが、出力で単語を強調表示したいので、これを行います。それは私の人生を1000倍簡単にします。

問題は、交差点に多くのファイルがあり、コマンドを実行すると、次のような出力が提供されることです。

zsh: argument list too long: ag

それ以外は私の回避策が動作します。次のコマンドを実行してこれをテストしました。

ag -C 1 --pager="less -R" "regexp1|regexp2" $(comm -12 patter1.txt regexp2.txt | head -10)

問題は、クロスリストが長すぎてコマンドラインに収まらないことです。検索するファイルのリストを渡すオプションが提供されている場合は、このオプションをスキップできますが、agその機能はありません。

とにかく、そうする必要はないことを願っています。この問題に対するより簡単な解決策があると仮定していますが、それが何であるかわかりません。


編集:いくつかの強調ルールを強化するために、いくつかの追加例があります。

実施例1

正規表現:

regex1 = a.
regex2 = .b

入力する

file8:
x
x
abc
x
x

出力:

2: x
3: <ab>c
4: x

実施例2

正規表現:

regex1 = foo
regex2 = oba

入力する

file9:
x
x
foobar
x
x

出力:

2: x
3: <foo>bar
4: x

grepとagがすでにこれを行っているので、この出力を選択しましたが、どちらの場合も非常に両面的であるため、これらの例を実装するのが難しい場合は、通常、これらの極端なケースで状況が異なるように動作するかどうかを強調してもかまいません。私のもの正規表現は重複しません。

関連情報