Extrahieren einer Teilmenge von Zeilen einer Datei basierend auf Regex für die erste und letzte Zeile

7

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?

Rory
quelle
2
Bitte geben Sie Eingabe- und Ausgabebeispiele an, und was bedeutet eine Zeile in der Mitte? Nicht die erste und nicht die letzte Zeile?
Chaos
Für GNUsed '/R/,/S/!d;/S/Q' large.text.file
Costas
Tragbarersed --posix -n '/R/{:1;p;n;/S/!b1;};/S/q'
Costas
Ihr POSIX ist kein POSIX ( ;ist ein gültiges Zeichen im Namen eines Etiketts, das Sie ;vorher benötigen }(und danach nichts mehr haben können)
Stéphane Chazelas
2
@chaos, obwohl ein Beispiel helfen könnte, ist die Frage klar und eindeutig definiert (die einzig mögliche ist, ob eine Linie sowohl mit R als auch mit S übereinstimmt), was hier selten genug ist, um gelobt zu werden. Das Schließen ist sicherlich nicht so unklar.
Stéphane Chazelas

Antworten:

5

Mit sed:

sed -n '/R/,$!d; /S/q; p'

Beispiel:

$ seq 20 | sed -n '/6/,$!d; /1/q; p'
6
7
8
9
Stéphane Chazelas
quelle
2

mit perl:

# perl -ne 'print if ( /R/ .. /S/ ); last if /S/'

Es druckt den S-Matching-regulären Ausdruck, tho '

Alien Lebensform
quelle
2

Mit awk

awk 'x&&/S/{exit};x+=/R/' file

Beispiel

seq 20 | awk 'x&&/1/{exit};x+=/6/'
6
7
8
9

quelle
Es könnte optimiert werden, indem nicht nach nachfolgenden Rs wieawk '/R/,0{if (/S/) exit; print}'
Stéphane Chazelas
@ StéphaneChazelas Cool, bearbeiten Sie meine Antwort nicht, um unnötige Semikolons hinzuzufügen :)
Das Semikolon wird von POSIX benötigt.
Stéphane Chazelas
@ StéphaneChazelas Nein, sind sie nicht? Zumindest nicht, wenn Sie das Argument --posixoder verwenden --compat? Auch für Ihre Optimierung bezweifle ich, dass dies bei einer Terabyte-Datei sogar einen Sekundenunterschied ausmachen würde.
Tatsächlich habe ich sogar einmal eine Anfrage bei der Austin-Gruppe eingereicht, um die Einschränkung zu lockern, da ich keine Implementierung finden konnte, die sie erzwang, aber sie wurde vom Betreuer von GNU awk abgelehnt. (Bitte beachten Sie auch, dass meine Kommentare niemals als konfrontativ gedacht sind, sondern nur zum Hinzufügen von Informationen).
Stéphane Chazelas
-1

Ich habe ein Programm geschrieben, um dieses Problem zu lösen

Sie können es so verwenden:

cat file | fromto -f R -T S

Wo Rist die regex Sie greifen wollen aus und Sist die regex Sie greifen wollen zu . Alle Zeilen zwischen diesen beiden werden ausgedruckt. -fbedeutet "die 'von' Zeile einschließen", -Fwürde bedeuten "die 'von' Zeile nicht einschließen". Ebenso mit -t/ -T. Die Frage war, die 'to'-Zeile auszuschließen, daher -Tist das Argument für diese Anforderung. Wenn Sie es verwenden -t, wird die Zeile "bis" gedruckt (danach jedoch keine Zeilen).

Rory
quelle
Bitte erläutern Sie Ihre Bewerbung.
PersianGulf
Ich habe dies um Details erweitert.
Rory