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 file
avait é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 i
sur 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)
-x
commutateur pour l'expression régulière de la ligne plutôt que-w
pour le mot? Cependant, je pense que le-F
commutateur annulera l'un d'eux, ou vice versa.i
motif le deuxième plutôt que le premier motif dustopwords
fichier modifie également le comportement.grep
ni avec GNUgrep
3.1.Réponses:
Il s'agissait d'un bogue
bsdgrep
lié à 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'
-w
option, 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 à votrestopwords
fichier l'apparence suivante:Cette solution de contournement nécessitera également que vous n'utilisez pas l'
-F
option.Notez que les composants d'expression régulière documentés
[[:<:]]
et[[:>:]]
dont lere_format
manuel vous parle ne fonctionneront pas ici. Cela est dû au fait que la bibliothèque d'expressions régulières compilée dans labsdgrep
prise 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 FreeBSDbsdgrep
, veuillez consulter Apple. ☺Lectures complémentaires
la source
Ce code:
produit:
Sur un système comme:
Plus de détails sur cgrep, disponibles via brew et sur sourceforge:
cheers, drl
la source