Ich habe eine große Textdatei und möchte nur einige der Zeilen betrachten. Die erste Zeile, die ich möchte, stimmt mit einem regulären Ausdruck überein R
, und wenn die Zeile mit dem regulären Ausdruck übereinstimmt S
, ist mir diese Zeile oder die folgenden Zeilen egal. Linien in der Mitte stimmen nicht überein R
. Gibt es eine Möglichkeit, dies in der Befehlszeile eines Bash-Befehls zu tun, damit ich die Ausgabe irgendwo danach weiterleiten kann?
7
sed '/R/,/S/!d;/S/Q' large.text.file
sed --posix -n '/R/{:1;p;n;/S/!b1;};/S/q'
;
ist ein gültiges Zeichen im Namen eines Etiketts, das Sie;
vorher benötigen}
(und danach nichts mehr haben können)Antworten:
Mit
sed
:Beispiel:
quelle
mit perl:
Es druckt den S-Matching-regulären Ausdruck, tho '
quelle
Mit awk
Beispiel
quelle
R
s wieawk '/R/,0{if (/S/) exit; print}'
--posix
oder verwenden--compat
? Auch für Ihre Optimierung bezweifle ich, dass dies bei einer Terabyte-Datei sogar einen Sekundenunterschied ausmachen würde.Ich habe ein Programm geschrieben, um dieses Problem zu lösen
Sie können es so verwenden:
Wo
R
ist die regex Sie greifen wollen aus undS
ist die regex Sie greifen wollen zu . Alle Zeilen zwischen diesen beiden werden ausgedruckt.-f
bedeutet "die 'von' Zeile einschließen",-F
würde bedeuten "die 'von' Zeile nicht einschließen". Ebenso mit-t
/-T
. Die Frage war, die 'to'-Zeile auszuschließen, daher-T
ist das Argument für diese Anforderung. Wenn Sie es verwenden-t
, wird die Zeile "bis" gedruckt (danach jedoch keine Zeilen).quelle