3

次のようにファイル内の2つのパターンを検索するために、findでgrepを2回使用することがよくあります。

find . -name \*.xml | xargs grep -l "<beans" | xargs grep singleton

それから私はもちろん上記のコマンドを破ったスペースのあるファイルに出くわしました。スペースを処理するために、次のように変更しました。

find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs grep singleton

オプション-print0は、findにスペースの代わりにprint nullを区切り文字として使用するように指示し、-0はxargsにnullを予期するように指示します。これは、探しているファイルのいずれにもパスにスペースが含まれていない限り機能しますが、スペースがあると機能しなくなります。

したがって、必要なのは、grepに改行ではなくスピアターとしてnullを出力するように指示するフラグです。

何か案は?

4

4 に答える 4

4

良い質問。Z オプションを使用すると、grep -l でヌルを区切り文字として使用できます。

find . -name \*.xml -print0 | xargs -0 grep -lZ "<beans" | xargs grep singleton

xargs を区切り文字として改行文字にすることもできます。それもうまくいくはずです:

find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs "--delimiter=\n" grep singleton

ただし、最初の解決策の方が優れています。

于 2012-09-28T19:39:25.373 に答える
1

xargs の代わりに GNU Parallel を使用すると、GNU Parallel はデフォルトで空白ではなく改行で分割されるため、これを回避できます。

find . -name \*.xml | parallel grep -l "<beans" | parallel grep singleton

詳細については、紹介ビデオをご覧ください: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-10-05T14:37:47.397 に答える
1
find . -name "*.xml"  -exec grep -q "<beans" {} \; -exec grep -q "singleton" {} \; -print

上記で行ったように、後のパイプ シーケンスでこれらのファイル名を使用する予定がある場合は、次のように変更-printします。-print0

于 2012-09-29T09:45:06.153 に答える
0

スペースの問題を回避するために、 -d オプションを使用して xargs の区切り文字として改行文字を使用します。

xargs -d '\n' ...

2 つの個別のパターン検索には、egrep を使用します。

egrep '(pattern one|pattern two)' ...

したがって、私の完全な解決策は次のようになります。

find . -name \*.xml | xargs -d '\n' egrep '(pattern one|pattern two)'
于 2016-08-03T11:06:31.673 に答える