パターンの始まりと終わりに2つの入力ファイルの行を使用して複数のファイルをgrepする方法は?

パターンの始まりと終わりに2つの入力ファイルの行を使用して複数のファイルをgrepする方法は?

grepを使用してファイルのリストを取得する簡単なスクリプトを作成したいと思います。現在のコードは次のようになります。

a= file1.txt 

b= file2.txt

for

do

grep '$a.*$b' /root/listoffiles/*php >> found.txt

完璧

file1どちらfile2も単語のリストです。したがって、複数の基準を使用して目的地を検索します。たとえば、$a「hello」と「world」になり、$b2行目が「red」と「tshirt」になります。 2つの条件が一致するものが見つかったら、ファイルに保存します。私が使っているループはうまくいかず、十分に効率的ではありません。私は基準に合った結果が欲しいだけです。どんな提案がありますか?

答え1

あなたが最初にする必要があります特殊文字脱出両方のファイルに(存在する場合)それからそれを結合します。たとえば、 'pasteで使用できるパターンのリストが作成されます。ファイルが多すぎない限り、複数の引数を持つループは必要ありません。受け入れることができます:grep-fgrep

paste -d'.*' <(sed 's/[.[\*^$]/\\&/g' file1.txt) /dev/null \
<(sed 's/[.[\*^$]/\\&/g' file2.txt) | grep -f - /root/listoffiles/*php >> found.txt

答え2

単語リストからパターンを作成します。 、、、、file1.txtおよび包含から正規表現を取得する必要があります(ERE構文から)。oneuneinsfile2.txttwodeuxzwei

(one|un|eins).*(two|deux|zwei)

単語リストに正規表現の特殊文字が含まれていない場合は、|改行文字(最後の文字を除く)を(「or」演算子)に置き換えるだけです。

words1=$(tr '\n' '|' <file1.txt); words1=${words1%\|}
words2=$(tr '\n' '|' <file2.txt); words2=${words2%\|}
grep -E "($words1).*($words2)"

単語リストに特殊文字を含めることができる場合は、その文字を引用する必要があります。

words1=$(<file1.txt tr '\n' '|' | sed 's/[][\\().*?+|]/\\&/g'); words1=${words1%\|}
words2=$(<file2.txt tr '\n' '|' | sed 's/[][\\().*?+|]/\\&/g'); words2=${words2%\|}
grep -E "($words1).*($words2)"

単語の順序を気にせずに重複一致を許可できる場合(たとえば、両方をtwone許可)、grep呼び出しは2回だけ必要です。onetwo

grep -f file1.txt | grep -f file2.txt

関連情報