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


10

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

私は以下を持っています

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

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

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

file
extensions

fileストップワードファイルで単語がスキップされたかのようです。今ここにクールなビットがあります:私は、単一の単語/文字変更することで、ストップワードファイルを変更した場合i、最初の行には、離れてから他のASCII文字にfile、その後、同じgrepコマンドは私の異なると正しい結果を与えますextensions

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

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


単語-x-wはなく行の正規表現にスイッチを使用したい場合がありますか?しかし、私は-Fスイッチがそれらのいずれかをキャンセルするか、またはその逆になると思います。
jesse_b 2017年

grep(GNU grep)3.1は期待どおりに動作します。
Hauke Laging

私はこれを複製しました。別の基準:iパターンをstopwordsファイルの最初のパターンではなく2番目のパターンにすると、動作も変更されます。
JdeBP '15年

OpenBSD 6.2での動作をネイティブでgrepもGNU grep3.1 でも再現できません。
クサラナンダ

回答:


13

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

ローカル修正

これをある程度回避-wするには、この変数に依存して正しい操作を行うために失敗するオプションを使用せず、代わりに単語の最初と最後に一致する正規表現拡張子を使用して、stopwordsファイルを次のようにします。

\ <i \>
\ <ファイル\>
\ <タイプ\>

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

なお、文書化された正規表現のコンポーネント[[:<:]][[:>:]]そのre_formatマニュアルは、あなたがおよそう伝えない、ここで働いています。これは、コンパイルされる正規表現ライブラリでbsdgrepGNU正規表現の互換性サポートがオンになっているためです。これは別のバグであり、修正されたと報告されています。

サービス修正

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

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

参考文献


いいですね、そしてこのアップストリームを報告してくれてありがとう。バグのあるコードを引用すると、この回答はさらに魅力的なものになります。
dhag 2017年

1

このコード:

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

crewの詳細については、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


新しいgrepを手に入れました。
Tim

@Tim-cgrepが私と同じくらい役立つことを願っています。私が行ったテストの速度は、GNU grepとほぼ同じであり、「コンテキスト/ウィンドウ処理」機能は非常に便利です。Linuxシステムでも簡単に構築できます...乾杯、drl
drl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.