web-dev-qa-db-ja.com

1文字の単語でのgrepの奇妙な動作

おおよそこれを使用して、テキストからストップワードを削除しています code

私は以下を持っています

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

結果を期待しています:extensions

(私は間違っていると思います)

file
extensions

これは、ワードfileがストップワードファイルでスキップされたかのようです。これがクールなビットです:最初の行の単一の単語/文字ifile以外の任意のASCII文字に変更してストップワードファイルを変更すると、同じgrepコマンドで異なるextensionsの正しい結果。

ここで何が起こっているのですか、どうすれば修正できますか?

Mac OSXでgrep(BSD grep)2.5.1-FreeBSDを使用していますGNU bash、バージョン4.4.12(1)

10
Tim

これはbsdgrepのバグであり、現在のスキャン対象の行の一部を追跡する変数に関連しており、複数のパターンが関係する場合に、正規表現マッチングエンジンへの連続呼び出しで上書きされます。

ローカル修正

これをある程度回避するには、-wオプションを使用しないでください。このオプションは、この変数に依存して正しい操作を行うために失敗しますが、代わりに、単語の先頭と末尾に一致する正規表現拡張を使用して、 stopwordsファイルは次のようになります。

\ <i \> 
\<file \> 
\<types \>

この回避策では、-Fオプションを使用しないことも必要になります。

ドキュメント化された正規表現コンポーネント[[:<:]]および[[:>:]]は、re_formatマニュアルに記載されているとおり、notここでは機能しません。これは、bsdgrepにコンパイルされる正規表現ライブラリでGNU正規表現の互換性サポートがオンになっているためです。これは別のバグであり、修正されたと報告されています。

サービス修正

このバグは今年初めに修正されました。この修正はまだFreeBSDのSTABLEまたはRELEASEフレーバーには含まれていませんが、現在のところ報告されています。

これをFreeBSDのgrepから派生したMacOSバージョンのbsdgrepに組み込むには、アップルにお問い合わせください。 ☺

参考文献

13
JdeBP

このコード:

pl " Input data file data1 and stopwords file data2:"
head data1 data2

pl " Expected output:"
cat $E

pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1

pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1

生成する:

-----
 Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions

==> data2 <==
i
file
types

-----
 Expected output:
extensions

-----
 Results, grep:
file
extensions

-----
 Results, cgrep:
extensions

次のようなシステム:

OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution        : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57

Cgrepの詳細については、brewから、およびsourceforgeから入手できます。

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : Mach-O64-bitexecutablex86_64 ...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

乾杯、drl

1
drl