grep strano comportamento con parole a lettera singola


10

Sto rimuovendo le parole di arresto da un testo, usando approssimativamente questo codice

Ho il seguente

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

Mi aspetto il risultato: extensions

ma ottengo il (penso errato)

file
extensions

È come se la parola filefosse stata ignorata nel file stopwords. Ora ecco il po 'fredda: se modifico il file stopwords, cambiando la parola / lettera isulla prima linea, a qualsiasi altra lettera ascii a parte f, i, l, e, poi lo stesso comando grep mi dà un risultato diverso e corretto extensions.

Cosa sta succedendo qui e come posso risolverlo?

Sto usando grep (BSD grep) 2.5.1-FreeBSD su un Mac OSX GNU bash, versione 4.4.12 (1)


Potresti voler usare l' -xopzione per la riga regex invece che -wper la parola? Tuttavia, penso che l' -Finterruttore annullerà uno di essi, o viceversa.
jesse_b,

grep (GNU grep) 3.1 funziona come previsto.
Hauke ​​Laging,

Ho replicato questo. Un altro dato: rendere il imodello il secondo anziché il primo modello nel stopwordsfile altera anche il comportamento.
JdeBP,

Non riesco a riprodurre il comportamento su OpenBSD 6.2 con nativo grepné con GNU grep3.1.
Kusalananda

Risposte:


13

Si è trattato di un bug bsdgreprelativo a una variabile che tiene traccia della parte della riga corrente ancora sottoposta a scansione che viene sovrascritta con successive chiamate al motore di corrispondenza delle espressioni regolari quando sono coinvolti più pattern.

correzione locale

Puoi aggirare questo in una certa misura non usando l' -wopzione, che si basa su questa variabile per il corretto funzionamento e quindi non riesce, ma invece usa le estensioni delle espressioni regolari che corrispondono all'inizio e alla fine delle parole, facendo apparire il tuo stopwordsfile come:

\ <I \>
\ <File \>
\ <\> tipi

Questa soluzione alternativa richiederà inoltre di non utilizzare l' -Fopzione.

Si noti che i componenti di espressione regolare documentati[[:<:]] e di [[:>:]]cui il re_formatmanuale parla non funzioneranno qui. Questo perché la libreria di espressioni regolari che viene compilata bsdgrepha attivato il supporto di compatibilità delle espressioni regolari GNU. Questo è un altro bug che è stato corretto.

correzione del servizio

Questo bug è stato corretto all'inizio di quest'anno. La correzione non è stata ancora trasformata nelle versioni STABLE o RELEASE di FreeBSD, ma secondo quanto riferito è in CORRENTE.

Per ottenere questo nella versione MacOS di grep, che è derivata da FreeBSD bsdgrep, consultare Apple. ☺

Ulteriori letture


Bello, e grazie per aver segnalato questo a monte. Troverei questa risposta ancora più affascinante se citasse il codice errato.
Dhag,

1

Questo codice:

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

produce:

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

Su un sistema come:

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

Maggiori dettagli su cgrep, disponibile via brew e da 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)

salute, drl


Mi sono appena procurato un nuovo grep.
Tim

@Tim - Spero che troverai cgrep utile come me. La velocità sui test che ho fatto lo ha approssimativamente paragonato a GNU grep e le funzionalità di "contesto / finestre" sono molto utili. Si basa anche facilmente su sistemi Linux ... evviva, drl
drl il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.