Ich entferne Stoppwörter aus einem Text und verwende ungefähr diesen Code
Ich habe folgendes
$ cat file
file
types
extensions
$ cat stopwords
i
file
types
grep -vwFf stopwords file
Ich erwarte das Ergebnis:
extensions
aber ich bekomme das (ich denke falsch)
file
extensions
Es ist, als ob das Wort file
in der Stoppwortdatei übersprungen wurde. Jetzt ist hier das kühle Bit: wenn ich die Stoppwörter - Datei ändern, indem Sie das Wort / den Wechsel i
in der ersten Zeile, jeden anderen ascii Brief abgesehen von f
, i
, l
, e
, dann wird der gleiche Befehl grep gibt mir ein anderes und korrektes Ergebnis extensions
.
Was ist hier los und wie behebe ich das?
Ich verwende grep (BSD grep) 2.5.1-FreeBSD auf einer Mac OSX GNU-Bash, Version 4.4.12 (1).
-x
Schalter für Zeilenregex anstelle von-w
Wort verwenden? Ich denke jedoch, dass der-F
Schalter einen von ihnen aufheben wird oder umgekehrt.i
Muster zum zweiten und nicht zum ersten Muster in derstopwords
Datei machen, ändert sich auch das Verhalten.grep
weder mit Native noch mit GNUgrep
3.1 reproduzieren .Antworten:
Dies war ein Fehler in
bsdgrep
Bezug auf eine Variable, die den noch zu scannenden Teil der aktuellen Zeile verfolgt, der mit aufeinanderfolgenden Aufrufen der Matching-Engine für reguläre Ausdrücke überschrieben wird, wenn mehrere Muster beteiligt sind.lokaler Fix
Sie können dies bis zu einem gewissen Grad umgehen, indem Sie nicht die
-w
Option verwenden, die für eine korrekte Operation auf dieser Variablen beruht und daher fehlschlägt, sondern stattdessen die Erweiterungen für reguläre Ausdrücke verwenden, die mit dem Anfang und dem Ende von Wörtern übereinstimmen, sodass Ihrestopwords
Datei wie folgt aussieht:Diese Problemumgehung erfordert auch, dass Sie die
-F
Option nicht verwenden .Beachten Sie, dass die dokumentierten Komponenten für reguläre Ausdrücke
[[:<:]]
und[[:>:]]
dasre_format
Handbuch, über das Sie informiert werden, hier nicht funktionieren. Dies liegt daran, dass in der Bibliothek für reguläre Ausdrücke, in die kompiliert wird, diebsdgrep
Kompatibilitätsunterstützung für reguläre Ausdrücke von GNU aktiviert ist. Dies ist ein weiterer Fehler, der angeblich behoben ist.Service-Fix
Dieser Fehler wurde Anfang dieses Jahres behoben. Das Update hat es noch nicht in die STABLE- oder RELEASE-Varianten von FreeBSD geschafft, ist aber Berichten zufolge in CURRENT.
Wenden Sie sich an Apple, um dies in die MacOS-Version von zu integrieren
grep
, die von FreeBSDs abgeleitet istbsdgrep
. ☺Weiterführende Literatur
quelle
Dieser Code:
produziert:
Auf einem System wie:
Weitere Details zu cgrep, erhältlich über Brew und von SourceForge:
Prost, drl
quelle