Wie zeige ich Daten vom Anfang einer Datei bis zum ersten Auftreten eines regulären Ausdrucks an?
Zum Beispiel, wenn ich eine Datei habe, die folgendes enthält:
%Vor%Ich möchte beginnen, den Inhalt der Datei beginnend bei Zeile 1 anzuzeigen und zu stoppen, wenn ich die Zeichenfolge "B *" finde. Die Ausgabe sollte also so aussehen:
%Vor%
perl -pe 'last if /^B/' source.txt
Eine Erklärung: Der Schalter -p fügt eine Schleife um den Code ein und verwandelt ihn in folgendes:
%Vor%Das letzte Schlüsselwort beendet die umgebende Schleife sofort, wenn die Bedingung erfüllt ist - in diesem Fall / ^ B /, was anzeigt, dass die Zeile mit einem B beginnt.
wenn es vom Anfang der Datei
ist %Vor%wenn Sie von einer bestimmten Zeilennummer
aus beginnen möchten %Vor% Einige der sed
-Befehle, die von anderen gegeben werden, werden die Eingabe unnötigerweise weiterverarbeiten, nachdem die Regex gefunden wurde, was für große Eingaben ziemlich langsam sein kann. Dies wird beendet, wenn die Regex gefunden wird:
Ich gebe nur einige Antworten, die ich erhalten habe:
Drucken Sie Daten beginnend in der ersten Zeile und fahren Sie fort, bis wir eine Übereinstimmung mit der Regex gefunden haben, und stoppen Sie dann:
%Vor%Drucken Sie Daten beginnend in der ersten Zeile, und fahren Sie fort, bis wir eine Übereinstimmung mit der Regex finden, aber nicht die Zeile anzeigen, die dem regulären Ausdruck entspricht:
%Vor%Mach es in sed:
%Vor%Ihr Problem ist eine Variante einer Antwort in perlfaq6 : Wie kann ich Linien zwischen zwei Mustern, die sich auf unterschiedlichen Linien befinden, herausziehen? .
Sie können den etwas exotischen Operator von Perl verwenden (dokumentiert in perlop):
%Vor%Wenn Sie Text und keine Zeilen möchten, verwenden Sie
%Vor%Wenn Sie jedoch geschachtelte Vorkommen von START bis END möchten, stoßen Sie auf das in der Frage in diesem Abschnitt beschriebene Problem des Abgleichens von ausgeglichenem Text.
Hier ist ein weiteres Beispiel für die Verwendung von ..:
%Vor%