ファイル1に正規表現があります。
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8802.*.*.*.*84231655.*
次のレコードを含む他の多くのファイルがあります。
0081347504;03.05.2019 10:51;000010;000000001000126289;8601;Kontaktschreiben;;;;;00000000000901326394;
0081349117;03.05.2019 10:51;000020;000000002000044721;8906;Termin vereinbaren;;;07.05.2019;10:00;14:00;00000000000901332422;
0081349117;03.05.2019 10:51;000030;000000002000044722;8906;Termin vereinbaren;;;07.05.2019;10:00;14:00;00000000000901332423;
0081351563;03.05.2019 10:52;000010;000000001000116607;8906;Termin vereinbaren;;;06.05.2019;13:00;18:00;00000000000901332339;
grep
file2のfile1のすべてのレコードが必要です。
私はそれを試しましたが、grep -Ff file 1 ./*
動作しません。
ベストアンサー1
少しきれいさは決して悪いことではありません。
まずは混乱するかもしれません。regexes
そしてGlobbing
;そして、どの行に関係なく同じ行を複数回繰り返す必要はありません(おそらく解釈する行が多いことを示そうとしていますregexes
が、各行を一意にするにはあまりにも怠惰です)。 ..しかし確実にするため)。だからこれ:
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8912.*.*.*.*81415444.*
.*8802.*.*.*.*84231655.*
代わりにこれを使用できます。
.*8912.*.*.*.*81415444.*
.*8802.*.*.*.*84231655.*
わかりました…今はどうですか? ...まあ、すべての行を(ではなく)grep
で使用するので、ファイルのすべての行は、... したがって一致させようとすると次のようになります。regex
globbing
grep
regex
存在する8912
存在する81415444
存在する
どこ存在する代表する:何もない
これ:
.*8912.*81415444.*
十分でしょう。
次にファイルで使用しますregex
。
.*8912.*81415444.*
.*8802.*84231655.*
ただし、一致させたい場合:
指す 存在する8912指す 存在する 指す 存在する 指す 存在する 指す 存在する81415444指す 存在する
どこ存在する代表する:何もないそして指す代表するテキストポイント、これはregex
間違っています。なぜなら でregexes
点がaだからです。meta-character
...毎回脱出する必要があります。テキストポイントbackslash
>を使用する\
と、正規表現は次のようになります。
\..*8912\..*\..*\..*\..*81415444\..*
次にファイルで使用しますregex
。
\..*8912\..*\..*\..*\..*81415444\..*
\..*8802\..*\..*\..*\..*84231655\..*
または、次のようにegrep
使用できます。grep --extended-regexp
拡張正規表現、正規表現を単純化重複制限、次のように、より簡潔な方法で上記と同じことを行います。
\..*8912(\..*){4}81415444\..*
\..*8802(\..*){4}84231655\..*
(正規表現を拡張しなくても同様のことができますが、次のようにもっとバックスラッシュを使用する必要があります。\..*8912\(\..*\)\{4\}81415444\..*
:)
それでは、2つのディレクトリを含むディレクトリにあると想像してください。一つは正規表現(1つは正規表現ファイルを含む)で、もう1つはサンプルファイル(正規表現に一致させるファイルを含むファイル)...
その後、次のコマンドを使用して目標を達成できます。
grep --colour -f ./regex/YOUR_REGEX_FILENAME ./sample_files/*
以下のようにいくつかの出力が表示されます。
./sample_files/sample_file2:0088027504;03.05.2019 10:51;000010;000000008423165589;8601;Kontaktschreiben;;;;;00000000000901326394;
./sample_files/sample_file7:0089128117;03.05.2019 10:51;000030;000000002814154447;8906;Termin vereinbaren;;;07.05.2019;10:00;14:00;00000000000901332423;
あなたはこう言うことができます:なぜ2つの別々のディレクトリがあるのですか?まあ、これは必ずしも必要ではありませんが、問題は、サンプルファイルと正規表現ファイルが同じディレクトリにあり、次のコマンドを使用する場合です。
grep -f file_1 ./*
これは./*
ワイルドカードを使用し、正規表現ファイルを含む現在のディレクトリ内のすべてのファイルと一致します。
この場合、たとえば、正規表現ファイルに一意の拡張子を追加してから、.regex
このファイルのグロービングパターンを変更するだけです。./!(*.regex)
...このグロービングは..で始まる名前を除外します。ファイルが.regex
存在する場合、コマンドは次のようになります。
grep -f file_1.regex ./!(*.regex)
最後に注意してください:エスケープしないと、シェルでスペースを含む名前は使用できません。各スペースをバックスラッシュでエスケープしたり、フルネームを引用符で囲むことができます。