~によるとこのスレッド:
Q:ackはPerlから派生した正規表現を使用していることを知っています。これは正しいですか?
答え:はい。実際、ackはPerlで書かれており、式を内部エンジンに渡します。
現在、ディレクトリに次のファイルがあります。
media_group_xml_producer.py
私がするとき:
> ack -n '.*group.*producer.*'
またはより直接的に:
> ack -n --python '.*group.*producer.*'
結果はありません。私が知る限り、正規表現はファイルと一致する必要があります。なぜそれを逃したのですか?
答え1
現在のディレクトリからファイル名をgrepする必要がある場合
ack はファイル名ではなくファイルの内容と一致します。名前が正規表現と一致するファイルを見つけるには、ファイル名リストに対してackを実行します。
ls | ack '.*group.*producer.*'
あなたは何をしましたか?
ack -n '.*group.*producer.*'
現在のディレクトリでファイルを探します含む正規表現に一致する項目です。
サブディレクトリパスを含むフルファイル名に対して正規表現を実行する場合
ls
パスとファイル名を印刷するオプションがないため、切り捨てられません。代わりに、(インデント行を印刷しない)フラグと(フルファイル名を印刷)tree
フラグを使用してください。-i
-f
tree -if | ack 'shepherd.*\.pyc?'
返品
./models/shepherd.py
./models/shepherd.pyc
./services/shepherd-related/flock_of_sheep.py
./services/shepherd-related/flock_of_sheep.pyc
もちろん、上記の内容はすべてgrep
に適用されますack
。しかし、ack
すべての点で確かに良いです。 :-)
答え2
あなたはack
何かを誤解しました。grep
シミュレーションではなくシミュレーションですfind
。パターンに一致するファイル名を検索せずに、特定のパターンのファイル内容を検索します。使用する必要があります
find -regex '.*group.*producer.*'
または
find -name '*group*producer*'
これを使用することに固執する場合ack
(たとえそれが言うべきではないと思いますが)、出力を解析してファイルを取得できます。
$ ack -f | ack '.*group.*producer.*'
media_group_xml_producer.py
実際には何も検索せずに検索中のすべてのファイルを印刷しack -f
、2番目のファイルは正規表現に一致するファイル名を印刷します。