Wie zeige ich Daten vom Anfang einer Datei bis zum ersten Auftreten eines regulären Ausdrucks an?

8

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%     
Pete 22.12.2009, 13:26
quelle

11 Antworten

11

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.

    
rjh 22.12.2009 14:16
quelle
7

wenn es vom Anfang der Datei

ist %Vor%

wenn Sie von einer bestimmten Zeilennummer

aus beginnen möchten %Vor%     
ghostdog74 22.12.2009 13:37
quelle
6
%Vor%

Drucken Sie von Zeile 1 bis / ^ B / (inklusive). -n unterdrückt das Standardecho.


Update: Opps .... wollte nicht "Bravo", sondern stattdessen die umgekehrte Aktion; -)

%Vor%

/ I3az /

    
draegtun 22.12.2009 14:20
quelle
5
%Vor%

Lies das wie folgt: Lösche ( d ) alle Zeilen beginnend mit der ersten Zeile beginnend mit einem "B" ( /^B/ ), hoch und bis zur letzten Zeile ( $ ).

    
ndim 22.12.2009 13:32
quelle
3

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:

%Vor%     
Dennis Williamson 22.12.2009 17:33
quelle
2

in Perl:

%Vor%     
catwalk 22.12.2009 13:30
quelle
2

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%     
Pete 22.12.2009 15:41
quelle
2

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%     
brian d foy 23.12.2009 01:25
quelle
1

Hier ist ein Perl-One-Liner:

%Vor%     
jmcnamara 22.12.2009 15:06
quelle
0

Wenn Perl eine Möglichkeit ist, könnten Sie so etwas tun:

%Vor%     
user236875 22.12.2009 13:33
quelle
0

ein Liner mit grundlegenden Shell-Befehlen:

%Vor%     
Vijay 22.01.2010 07:06
quelle

Tags und Links