it-swarm.com.de

Grep Linie mit 0 aber nicht 0,2 entfernen?

Ich habe eine Datei, deren Inhalt dem folgenden ähnlich ist.

0
0
0.2
0
0
0
0

Ich muss alle Zeilen mit einer einzigen Null entfernen.
Ich habe überlegt, grep -v "0" Zu verwenden, aber dadurch wird auch die Zeile mit 0,2 entfernt. Ich habe gesehen, dass ich die Option -w Verwenden könnte, aber das scheint auch nicht zu funktionieren.

Wie kann ich alle Zeilen entfernen, die nur eine einzige 0 enthalten, und alle diese Zeilen mit einer 0 beginnen lassen?

12
grep -vx 0

Von man grep:

-x, --line-regexp
       Select only those matches that exactly match the whole line.
       For a regular expression pattern, this is like parenthesizing
       the pattern and then surrounding it with ^ and $.

-w Schlägt fehl, weil das erste 0 In 0.02 Als "Wort" betrachtet wird und daher diese Zeile übereinstimmt. Dies liegt daran, dass auf ein "Nicht-Wort" -Zeichen folgt. Sie können dies sehen, wenn Sie den ursprünglichen Befehl ohne -v Ausführen, d. H. grep -w "0".

35
Sparhawk

Mit grep:

grep -v "^0$" file

^ bedeutet Zeilenanfang, $ bedeutet Zeilenende.

28

Während grepcan dafür verwendet werden kann (wie andere Antworten deutlich zeigen), gehen wir einen Schritt zurück und überlegen, was Sie tatsächlich wollen:

  • Sie haben eine Datei mit Zahlen
  • Sie möchten eine Filterung basierend auf dem numerischen Wert durchführen.

Regex interpretiert Zeichensequenzdaten. Sie kennen keine Zahlen, nur einzelne Ziffern (und reguläre Kombinationen davon). Obwohl es in Ihrem speziellen Fall einen einfachen Hack um diese Einschränkung gibt, handelt es sich letztendlich um eine Nichtübereinstimmung der Anforderungen.

Sofern es hier keinen sehr guten Grund gibt, grep zu verwenden (z. B. weil Sie es gemessen haben und es wesentlich effizienter ist und die Effizienz in Ihrem Fall von entscheidender Bedeutung ist), empfehle ich die Verwendung eines anderen Tools.

awk kann beispielsweise basierend auf numerischen Vergleichen filtern, z.

awk '$1 == 0' your_file

Aber auch, um alle Zeilen zu erhalten, die Zahlen größer als Null enthalten:

awk '$1 > 0' your_file

Ich liebe Regex, es ist ein großartiges Werkzeug. Aber es ist nicht das nur Tool. Wie das Sprichwort sagt, wenn alles, was Sie haben, grep ist, sieht alles wie eine normale Sprache aus.

14
Konrad Rudolph

grep 's -w ist etwas verworren, so dass die ursprüngliche Zeichenfolge in Word- und Nicht-Word-Bestandteile (alles außer Buchstaben, Ziffern oder Unterstrichen) aufgeteilt wird. Da es bereits einen gültigen Wortbestandteil gefunden hat 0 im 0.02 es hatte die Negationslogik bestätigt, um die Zeile zu entfernen.

Die Verwendung von sed ist in diesem Zusammenhang etwas einfach, um nur die gesamten übereinstimmenden Wörter zu entfernen

sed '/^0$/d' file
5
Inian

Wenn die Zeilen, die Sie löschen möchten nur enthalten a 0gefolgt von der nächsten Zeile Sie können diese Zeilen auswählen, indem Sie den folgenden Befehl eingeben:

grep -v "^0$"

Dies druckt nur die Vorkommen von 0 die am Ende einer Zeile und am Anfang einer Zeile gleichzeitig. Das -v Option kehrt dann unsere Auswahl um.

3
majesticLSD

Angenommen, jede Zeile, die nicht nur eine einzelne 0 ist, hat einen Punkt

grep '\.' file

0
Roger Mungo
  • \ b - Wortgrenze

grep -v "\b0\b"

  • passen Sie den Zeilenanfang, Ihr Muster und das Zeilenende an

grep -v "^0$"

  • oder wie von @Sparhawk vorgeschlagen -vx lineregexp

- w funktioniert, aber in Ihrem Fall .2 sind zwei Wörter, da das Punktzeichen ein Worttrennzeichen ist.

0
Jakub Jindra

Eine weitere Antwort aus Gründen der Abwechslung, vorausgesetzt, Sie haben ein PCRE-fähiges grep

grep -Pv "^0(?!\.)"

dies führt ein negatives Lookahead aus, um den Zeilen zu entsprechen, die mit 0 beginnen, und wird nicht von einem Punkt gefolgt . Dann verwirft -v Nicht übereinstimmende Zeilen. Sie können in Aktion sehen hier

0
mrbolichi