2017-11-16 11 views
1

私は電話番号と一致する以下の正規表現を持っています。正規表現は(123)123-123で動作しますが、私は最後の結果に困惑しています。grepは "<正規表現>"を返します。そのようなファイルやディレクトリはありません

[email protected]: grep -l -v -f *.txt -E "(\d{3})-\d{3}-\d{3}" 
f2.txt 
f3.txt 
f4.txt 
grep: (\d{3})-\d{3}-\d{3}: No such file or directory 

なぜgrepが正規表現を検索していますか?ここで

lsです:

[email protected]:/tmp# ls 
f1.txt f2.txt f3.txt f4.txt 

答えて

4

grepの使用量が

grep [OPTION]... PATTERN [FILE]... 

あなたのコマンドが

grep -f f1.txt -l -v -E f2.txt f3.txt f4.txt "(\d{3})-\d{3}-\d{3}" 
に相当し

grep -l -v -f f1.txt f2.txt f3.txt f4.txt -E "(\d{3})-\d{3}-\d{3}" 

に展開されています

"パターンを含むファイルとしてファイルf1.txtを使用し、ファイルを検索すると、f2.txtf3.txtf4.txtおよび(\d{3})-\d{3}-\d{3}というファイルが検索されます。どこにでもオプション-l-v-Eの適用「

をたぶんあなたの代わりに

grep -l -v -E "(\d{3})-\d{3}-\d{3}" *.txt 

を意味し、次のように

relevant part of the man pageを読み取ります。?

-f FILE--file=FILE
からパターンを取得しますFILE、1行に1つ。このオプションを複数回使用するか、または-e--regexp)オプションと組み合わせると、指定されたすべてのパターンを検索します。空のファイルにはパターンがないため、何も一致しません。

サイドノート:-Eを使用する場合、リテラルカッコをエスケープする必要があります。あなたは

grep -P '\(\d{3}\)-\d{3}-\d{3}' 

または

grep -E '\([[:digit:]]{3}\)-[[:digit:]]{3}-[[:digit:]]{3}' 
+0

のいずれかを使用する必要があると思いますので、また、\dは、私の知る限りサポートされていない詳細な説明をありがとうございました。私はいくつかのことを学びました。 – CppLearner

関連する問題