2016-12-13 8 views
1

Ich versuche, einen Grep-Filter zu entwerfen, in dem ich 2 oder weniger Wörter habe. Ich bin leer, wenn ich seltsamerweise nach dieser Antwort suche.Wie grep ich eine Spalte nach Wortanzahl filtern?

Etwas wie:

cat someFile.txt | grep count(\w) < 3 

Existiert diese Funktionalität auch?

Antwort

1

Mit grep, könnten Sie auf einem Muster entsprechen, die genau 1 oder 2 Wörter Spiele:

grep -E '^\w+(\s+\w+)?$' someFile.txt 

(Beachten Sie, dass dies voraus, dass Sie entweder keine Leerzeilen haben, oder wollen nicht wählen . diejenigen sowieso)


Mit awk Sie könnten nur die Anzahl der Felder Bedingung verwenden:

awk 'NF < 3' someFile.txt 
1

Verwenden Sie einfach awk statt grep für diese wie folgt aus:

awk 'NF < 3' file 

NF steht für die Anzahl der Felder.

1

Grep

grep -E '^$|^\S+(\s+\S+)?$' file 
  • \S nicht-Leerzeichen;
  • ? macht das vorhergehende Muster optional (Wiederholung null oder einmal).
  • | ist der Alternationsoperator (das Ergebnis ist true, wenn eines der Muster übereinstimmt);
  • ^$ entspricht der Leerzeile;

Das gleiche Muster funktioniert auch mit der Option -P (Perl-kompatible reguläre Ausdrücke).


GNU Sed:

sed -nr '/^$|^\S+(\s+\S+)?$/ p' file 

wo

  • p ist ein Befehl, der den aktuellen Musterraum druckt (die aktuelle Zeile, insbesondere), wenn das vorangehende Muster übereinstimmt die Linie;
  • -n deaktiviert das automatische Drucken des Musterbereichs.

Das Muster ist das gleiche wie für den obigen Befehl grep.


Perl

perl -C -F'/\s+/' -ane 'print if scalar @F < 3' < file 

wo

  • -C ermöglicht Unicode-Unterstützung;
  • -F spezifiziert Muster für Schalter (Autosplit-Modus, der den Eingang in @F Array teilt);
  • -n bewirkt, dass das von -e angegebene Skript für jede Zeile vom Eingang ausgeführt wird;
  • scalar @F gibt die Anzahl der Elemente in @F zurück, d. H. Die Anzahl der Felder.
+0

Wie Benutzer @ Amber unten sagte, kann die Grep-Anweisung Leerzeichen überspringen. Gibt es eine Änderung, um Leerzeichen einzufügen? Und was ist der Unterschied zwischen -E und -P? – Tom

+0

@Tom, grep überspringt Leerzeilen, wenn das Muster nicht mit Leerzeilen übereinstimmt. Ich habe in den Befehlen _sed_ und _grep_ leere Zeilen mit '^ $ |' hinzugefügt. Greps "-P" fügt zusätzliche Funktionen hinzu, die in "pcresyntax (3)" und "pcrepattern (3)" beschrieben sind, wenn PCRE auf dem System verfügbar ist. By the way, Ambers Lösung zählt nur ASCII "Wörter" '\ w +' –

Verwandte Themen