grep Zeilen beginnend mit "1" in Ubuntu


46

Ich versuche nach Zeilen zu suchen, die mit "1" beginnen

ls -1 | grep ^1*

Es werden jedoch Zeilen zurückgegeben, die nicht mit 1 beginnen. Was fehlt mir hier?


Noch ein Hinweis: Wenn Sie die lsAusgabe mit grep begrenzen möchten, treten Probleme auf, wenn Dateinamen seltsame Zeichen enthalten, z. B. Zeilenumbrüche ... Viele andere Befehle (irgendwie nicht ls, zumindest nicht die Version, die ich überprüfen muss) Sie haben die Möglichkeit, eine durch Null getrennte Ausgabe zu erstellen, die Sie dann sicher verarbeiten könnengrep -z
Gert van den Berg

Danke, @GertvandenBerg! Welche Probleme können einige seltsame Zeichen wie Newlines verursachen, um zu grepen? Welche Befehle geben eine durch Null getrennte Ausgabe aus?
Tim

1
find mit -print0, die meisten anderen GNU-Tools haben die Option -0 oder -z. (sort, xargs, etc auch). Wenn die Dateinamen neue Zeilen enthalten, ist es unmöglich zu wissen, ob zwei Zeilen ein Dateiname sind, der eine neue Zeile oder zwei separate Dateinamen enthält.
Gert van den Berg

Antworten:


67

Dein regulärer Ausdruck bedeutet nicht, was du denkst. Es stimmt mit allen Zeilen überein, die mit einem (1) beginnen und null oder mehr (*) Mal wiederholt werden. Alle Zeichenfolgen stimmen mit diesem regulären Ausdruck überein. grep '^1'macht was du willst.


33

Hast du folgendes probiert?

 ls -1 | grep "^1"

Das heißt, entfernen Sie die *, was im Grunde sagt grep, null oder mehr Vorkommen des ^1Ausdrucks zu finden. Mit anderen Worten: Passen Sie die Zeilen an, die mit einer 1 beginnen, oder nicht.


13

Obwohl dies Ihre Frage nicht beantwortet, ist dies eine bessere Lösung für das, was Ihr Ziel zu sein scheint:

ls -ld 1*

Sie können ein Shell-Glob verwenden, um alle Dateien aufzulisten, die mit beginnen 1. Beachten Sie, dass dies *beim Shell-Globbing eine andere Bedeutung hat als bei regulären Ausdrücken.


Vielen Dank! +1. Wie hat * im Shell-Globbing und in regulären Ausdrücken eine andere Bedeutung?
Tim

2
In einem Shell-Glob * steht ein Platzhalter für "0 oder mehr eines beliebigen Zeichens". Die Bedeutung von Regex wird in Otokans Antwort erklärt.
Jordanien

3

^ 1. * entspricht der ganzen Zeile, oder wie oben gesagt, ^ 1 hat die in der Zeile enthaltene Zeichenfolge erhalten.

Verschiedene Stile von Regex verwenden verschiedene Symbole, die Zeichen darstellen. Einige Optionen legen fest, welchen Stil Sie verwenden möchten. und verschiedene Optionen geben an, ob Sie die gesamte Zeile oder nur einen Teil davon oder die gesamte Eingabe als eine Zeichenfolge abgleichen möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.