2017-10-03 5 views
0

私はデバッグできないgrepに問題があります。これはMac OS High Sierraで再現可能ですが、問題は現在のUbuntuでは発生しません(期待通りに動作します)。MacOS 10.13のパターンファイルを使用したgrepの回避策

私は三つのファイルがあります:あなたがして、これらの3つのファイルを作成することができます

cat haystack 
apple 
aardvark 
cow 

cat pattern1 
a 
aardvark 
animal 

cat pattern2 
c 
b 
apple 

を:

perl -e 'print "a\naardvark\nanimal"' > pattern1; 
perl -e 'print "c\nb\napple"' > pattern2; 
perl -e 'print "apple\naardvark\ncow"' > haystack; 

は、ここで問題です:これは予想される応答が得られます。

grep -iowFf pattern2 haystack 
apple 

説明するために、 、grep ...

-i = case insensitive 
-o = display the match 
-w = word match <== this is the option which is breaking it 
    The expression is searched for as a word (as if surrounded by `[[:<:]]' and `[[:>:]]' 
-F = fast grep (fixed strings) 
-f = read pattern from file 

これは何も返しません:

grep -iowFf pattern1 haystack 

しかし、私は "pattern1" "aardvark" を返すことを期待します。

私はこの小さなテストベッドで実験していましたが、実際のプロジェクトははるかに大きくなっています。そして、私がpatternNファイル内の行のシーケンスを変更すると結果が変わることがわかりました。 "aardvark"

を返し

sort -r pattern1 > pattern1.reverse 
grep -iowFf pattern1.reverse haystack 

私は何をしないのですか?私はこれについて私の頭を叩いています。 MacOS 10.13のバグですか?回避策はありますか? (私のパターンでは-wパラメータを\ b .... \ bに置き換え、-Fはオフにしますが、非常に大きなファイルを処理していますので、パフォーマンスが必要です)。

答えて

2

MacOSXの場合:

$ grep -V 
grep (BSD grep) 2.5.1-FreeBSD 

オンCentos7

$ grep -V 
grep (GNU grep) 2.20 

両方のバージョンが異なって動作します(気づいたとおり)。この問題を回避するには、MacOSXにgrepのGNU版をbrew install grepという名前でインストールし、接頭辞がgのGNU grepをインストールします。今すぐできる:

$ ggrep -iowFf pattern1 haystack 
aardvark 
関連する問題