grep comportement étrange avec des mots d'une seule lettre


10

Je supprime les mots vides d'un texte, en utilisant à peu près ce code

J'ai le suivant

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

J'attends le résultat: extensions

mais je reçois le (je pense incorrect)

file
extensions

C'est comme si le mot fileavait été ignoré dans le fichier des mots vides. Maintenant, voici le bit cool: si je modifie le fichier des mots vides, en changeant le mot / lettre isur la première ligne, à toute autre lettre ascii à part f, i, l, e, puis la même commande grep me donne un résultat différent et correcte extensions.

Que se passe-t-il ici et comment y remédier?

J'utilise grep (BSD grep) 2.5.1-FreeBSD sur un bash Mac OSX GNU, version 4.4.12 (1)


Vous voudrez peut-être utiliser le -xcommutateur pour l'expression régulière de la ligne plutôt que -wpour le mot? Cependant, je pense que le -Fcommutateur annulera l'un d'eux, ou vice versa.
jesse_b

grep (GNU grep) 3.1 fonctionne comme prévu.
Hauke ​​Laging du

J'ai reproduit cela. Autre donnée: faire du imotif le deuxième plutôt que le premier motif du stopwordsfichier modifie également le comportement.
JdeBP

Je ne peux pas reproduire le comportement sur OpenBSD 6.2 avec natif grepni avec GNU grep3.1.
Kusalananda

Réponses:


13

Il s'agissait d'un bogue bsdgreplié à une variable qui suit la partie de la ligne actuelle à analyser, qui est remplacée par des appels successifs au moteur de correspondance d'expressions régulières lorsque plusieurs modèles sont impliqués.

correction locale

Vous pouvez contourner cela dans une certaine mesure en n'utilisant pas l' -woption, qui s'appuie sur cette variable pour un fonctionnement correct et donc échoue, mais à la place en utilisant les extensions d'expressions régulières qui correspondent au début et à la fin des mots, ce qui donne à votre stopwordsfichier l'apparence suivante:

\ <i \>
\ <fichier \>
\ <types \>

Cette solution de contournement nécessitera également que vous n'utilisez pas l' -Foption.

Notez que les composants d'expression régulière documentés[[:<:]] et [[:>:]]dont le re_formatmanuel vous parle ne fonctionneront pas ici. Cela est dû au fait que la bibliothèque d'expressions régulières compilée dans la bsdgrepprise en charge de la compatibilité des expressions régulières GNU est activée. Il s'agit d'un autre bug qui aurait été corrigé.

correctif de service

Ce bug a été corrigé plus tôt cette année. Le correctif n'a pas encore fait son entrée dans les versions STABLE ou RELEASE de FreeBSD, mais serait dans CURRENT.

Pour obtenir ceci dans la version MacOS de grep, dérivée de FreeBSD bsdgrep, veuillez consulter Apple. ☺

Lectures complémentaires


Bien, et merci d'avoir signalé cela en amont. Je trouverais cette réponse encore plus fascinante si elle citait le code buggy.
dhag

1

Ce code:

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

produit:

-----
 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

Sur un système comme:

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

Plus de détails sur cgrep, disponibles via brew et sur 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)

cheers, drl


je viens de recevoir un nouveau grep.
Tim

@Tim - J'espère que vous trouverez cgrep aussi utile que moi. La vitesse des tests que j'ai effectués le met à peu près au même niveau que GNU grep, et les fonctionnalités "context / fenêtrage" sont très utiles. Il s'appuie également facilement sur les systèmes Linux ... cheers, drl
drl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.