GNU/Linux >> Linux の 問題 >  >> Linux

2つの異なる単語が存在するテキストファイルを検索しますか(任意の順序、任意の行)?

同じファイルに2つの単語インスタンスが存在するファイルを検索する方法を探しています。これまで、以下を使用して検索を実行してきました。

find . -exec grep -l "FIND ME" {} ;

私が遭遇している問題は、「FIND」と「ME」の間にスペースが1つだけ存在しない場合、検索結果でファイルが生成されないことです。 「FINDME」ではなく「FIND」と「ME」の両方の単語がファイルに存在する以前の検索文字列をどのように適合させるのですか?

AIXを使用しています。

承認された回答:

GNUツールの場合:

find . -type f  -exec grep -lZ FIND {} + | xargs -r0 grep -l ME

標準的に行うことができます:

find . -type f -exec grep -q FIND {} ; -exec grep -l ME {} ;

ただし、最大2つのgrepが実行されます。 ■ファイルごと。その数のgrepの実行を回避するには ■ファイル名に任意の文字を使用できるようにしながら、移植性を維持するには、次のようにすることができます。

convert_to_xargs() {
  sed "s/[[:blank:]"']/\\&/g" | awk '
    {
      if (NR > 1) {
        printf "%s", line
        if (!index($0, "//")) printf "\"
        print ""
      }
      line = $0
    }'
    END { print line }'
}

export LC_ALL=C
find .//. -type f |
  convert_to_xargs |
  xargs grep -l FIND |
  convert_to_xargs |
  xargs grep -l ME

findの出力を変換するというアイデア xargsに適した形式に変換します(空白が必要です(CのSPC/TAB / NL ロケール、他のロケールのYMMV)一重引用符、二重引用符、円記号で空白などをエスケープできる単語のリストを区切ります。

通常、find -printの出力を後処理することはできません 、ファイル名を改行文字で区切り、ファイル名に含まれる改行文字をエスケープしないためです。たとえば、次のように表示されます:

./a
./b

bという1つのファイルかどうかを知る方法がありません a<NL>.というディレクトリにあります または、2つのファイルの場合a およびb 現在のディレクトリにあります。

.//.を使用する 、// findによって出力されたファイルパスにそれ以外の場合は表示できません (名前が空で/のディレクトリなどがないため ファイル名には使用できません)、//を含む行が表示された場合は 、それが新しいファイル名の最初の行です。したがって、そのawkを使用できます すべての改行文字をエスケープするコマンド。ただし、それらの行の前にある文字はエスケープします。

上記の例をとると、find 最初のケース(1つのファイル)で出力されます:

.//a
./b

どのawkが脱出するか:

.//a
./b

そのため、xargs それを1つの引数と見なします。そして2番目のケース(2つのファイル):

.//a
.//b

どのawk そのままにしておくので、xargs 2つの引数が表示されます。

関連:Tmuxマウスモードをオンにすると、マウスでテキストを選択できませんか?

LC_ALL=Cが必要です だからsedawk (およびxargsのいくつかの実装 )任意のバイトシーケンスに対して機能し(ユーザーのロケールでは有効な文字を形成しませんが)、空白を単純化します。 SPCとTABのみを定義し、さまざまなユーティリティによるバックスラッシュのエンコードがエンコードに含まれている文字のさまざまな解釈に関する問題を回避します。


Linux
  1. Linuxでテキストファイルに行番号を追加する方法

  2. 異なるファイルの2つの列を比較し、一致する場合は印刷しますか?

  3. 同じ行の2つの検索パターン間で値を抽出しますか?

  1. サイズと拡張子でファイルを検索する方法は?

  2. Linux – PDFファイルのメタデータはどこにありますか?任意のPDFファイルにメタデータを挿入できますか?

  3. パス名に特定の順序なしで複数の単語が含まれているファイルを検索しますか?

  1. Linuxのコマンドラインを使用してファイルを作成する

  2. Linuxでファイルを検索するには、検索と検索を使用します

  3. Linuxシェルスクリプトで正規表現を使用してファイルを検索する方法