Ich habe eine Textdatei, die ich nach den 64 Hexagrammen des Yi Jing in 64 ungleiche Teile aufteilen möchte. Da die Passage für jedes Hexagramm mit einigen Ziffern, einem Punkt und zwei Zeilenumbrüchen beginnt, sollte der reguläre Ausdruck ziemlich einfach zu schreiben sein.
Aber wie teile ich die Textdatei gemäß dieser Regex tatsächlich in 64 neue Dateien auf? Es scheint eher eine Aufgabe für perl
. Aber vielleicht gibt es einen offensichtlicheren Weg, den ich einfach total vermisse.
quelle
'\.'
das nicht auch?Ich denke der beste Weg ist
awk
undgawk
.awk
-F
Gibt für jede Zeile einen Feldtrenner an. Es ist ein regulärer Ausdruck, hier verwenden wir mehrere Trennzeichen:". "
und" / "
. So wird eine Zeile wie1. Ch'ien / The Creative
in 3 Felder aufgeteilt:1
Ch'ien
undThe Creative
. Später können wir auf diese Felder mit verweisen$n
.$0
ist die gesamte Zeile.Wir
^[0-9]{1,3}[.]
weisen die awk dann an, die Linien mit dem Muster abzugleichen. Wenn es eine Übereinstimmung gibt, weisen wir Wert zux
. Der Wert x wird als Dateiname für dieprint
Operation verwendet. In diesem Beispiel geben wir in"F"$1"("$2").txt"
der Zeile1. Ch'ien / The Creative
einen Dateinamen anF1(Ch'ien).txt
gaffen
In Gawk können wir auch auf gefangene Gruppen zugreifen. So können wir den Befehl vereinfachen, um:
hier verwenden wir
match
das erfassen der gruppen und fügen sie in die variable liste einary
.$0
ist die gesamte Zeile.ary[0]
ist alles abgestimmt.ary[1...n]
ist jede Gruppe.perl
Wir können es auch mit Perl machen:
Ergebnisse:
So erhalten Sie die Beispieldatei:
quelle
Mit GNU coreutils können Sie
csplit
eine Datei in durch Regexp getrennte Teile aufteilen, wie von Geekosaurier gezeigt .Hier ist ein portables awk-Skript, um eine Datei in Teile zu zerlegen. Es funktioniert von
getline
, um mit dem mehrzeiligen (2-zeiligen) Trennzeichen umzugehen;outfile
auf den Namen der Datei, auf die gedruckt werden soll, wenn eine Abschnittsüberschrift auftritt.quelle
nunber.
folgt Text, der einen Schrägstrich enthält/
. Ich bin mir ziemlich sicher, dass das erwähntetwo newlines
ixtmixilix die 2 Leerzeilen sind , die der numerischen Kennung vorangehen und die Überschrift genauer identifizieren, aber da die Daten auf der Webseite nur/^[0-9]+\.
in den Abschnittsüberschriften übereinstimmen , müssen sie nicht berücksichtigt werden ( in diesem speziellen Fall). Vielen Dank; vor allem für das Intro zugetline
.. PS. kann dabei sein wenn?while
da, falls die Eingabe enthält1.\n2.\n\n
(wo\n
sind Zeilenumbrüche): Das2.
muss in der Kopfzeile erkannt werden. Es wird hier nicht vorkommen, aber ich unterstütze es in meinem Code, um es allgemeiner zu gestalten (und der Spezifikation in der Frage genauer zu entsprechen).