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?

Tim
quelle
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.

Otokan
quelle
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.

Bernhard
quelle
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.

Jordanien
quelle
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.

Shellukolle
quelle