Ich möchte Textinhalte (mit XML-ähnlichen Tags) anhand ihrer Einrückungstiefe kennzeichnen. Leerzeilen sollten beibehalten werden. Der Inhalt des folgenden Beispiels wird mit 1, 2 oder 3 Registerkarten eingerückt.
EINGANG
aaa bbb bbb aaa ccc ccc bbb bbb
Ich möchte mit der gleichen Einzugsebene zu Gruppenleitungen und diese Einrückungen um Schlagworte übersetzen x
, y
und z
, wie folgt aus :
AUSGABE
<x>aaa</x>
<y>bbb
bbb</y>
<x>aaa</x>
<z>ccc
ccc</z>
<y>bbb
bbb</y>
Wie kann ich das machen?
script
text-manipulation
Ramaprakasha
quelle
quelle
<b>
Strophen.a
,b
,c
.Antworten:
Problemstellung:
Eine Eingabedatei enthält Text, der mit null oder mehr Tabulatorzeichen eingerückt ist. Im Einzelnen ist jede Zeile in der Eingabe eine der folgenden:
Es gibt keine Zeilen, die
Oder
oder
Die Eingabe wird logisch in Gruppen von Zeilen zerlegt, die alle entweder sind
Leerzeilen werden unverändert an den Ausgang durchgereicht.
Es ist eine Liste von Tags anzugeben. zB
x
,y
undzz
. Eine Gruppe von (nicht leeren) Zeilen, die mit Null-Tabulatoren eingerückt sind (dh nicht eingerückt sind), muss zwischen<x>
und stehen</x>
. Eine Gruppe von Zeilen, die mit einem Tabulator eingerückt sind, muss in<y>
und stehen</y>
. Eine Gruppe von Zeilen, die mit zwei Tabulatoren eingerückt sind, muss zwischen<zz>
und stehen</zz>
. (Zeilen werden nicht mit mehr als zwei Tabulatoren eingerückt.)In der ersten Zeile einer Gruppe (von nicht leeren Zeilen) muss das Anfangsetikett zwischen den Tabulatoren und dem Text eingefügt werden. In der letzten Zeile einer Gruppe muss das End-Tag am Ende des Textes angehängt werden. Eine Gruppe kann aus einer einzelnen Zeile bestehen, sodass die erste Zeile auch die letzte Zeile sein kann. Alle Zeilen einer anderen Gruppe als der ersten werden zusätzlich um die Breite des Anfangstags eingerückt (mit Leerzeichen zwischen den Tabulatoren und dem Text).
Zum Beispiel (mit
―→
, um eine Registerkarte darzustellen), diese EINGABE :soll in dieses OUTPUT übersetzt werden :
Lösung:
Offensichtlich wissen wir nicht genau, was wir mit einer Eingabezeile tun sollen, bis wir die nächste Zeile gelesen haben. Dieses Problem wird normalerweise behoben, indem der Inhalt einer zu verarbeitenden Zeile gespeichert wird, nachdem die nächste gelesen wurde.
Hier ist es also:
Der BEGIN-Block initialisiert die Tags (
x
,y
undzz
) durch Aufteilen einer durch Leerzeichen getrennten Zeichenfolge. Dastag_pad
Array enthält genügend Leerzeichen, um mit der Breite der Tags übereinzustimmen (einschließlich<
und>
):tag_pad[1]
undtag_pad[2]
drei Leerzeichen;tag_pad[3]
ist vier Leerzeichen.Wenn wir eine Eingabezeile lesen, analysieren wir sie. Wenn es keine Felder (
NF == 0
) enthält, muss es leer sein (da wir angegeben haben, dass keine Zeile ausschließlich aus Leerzeichen und Tabulatoren besteht). Setzen Sie esindent_num
auf 0. Anderenfalls messen Sie den Einzug, indem Sie die Position von$1
(dem ersten Wort) in$0
(ermitteln. die gesamte Zeile).index
Gibt einen Wert ab 1 zurück. Dies ist also eine Stelle mehr als die Anzahl der Leerzeichen vor dem ersten Nicht-Leerzeichen (und wir gehen davon aus, dass dies alle Registerkarten sind). Das ist ein Glücksfall, denn jetztindent_num
entspricht es den Einträgen in den Arraystags
undtag_pad
. Dann teilen wir die Zeile in einindent_str
(Leerzeichen) und einrestOfLine
(alles nach dem Einzug).Jetzt verlassen wir uns auf gespeicherte Informationen. Wenn diese Zeile einen anderen Einzug hat als die vorherige, beginnen wir eine neue Gruppe. Wenn es ist eine gespeicherte Zeile, schreiben Sie es aus, mit dem entsprechenden End - Tag am Ende der Zeile.
Wenn die aktuelle Zeile leer ist, drucken Sie sie einfach aus. Überprüfen Sie, ob die aktuelle Einrückungsstufe zu hoch ist, und sichern Sie sie, falls dies der Fall ist. Wenn der aktuelle Einzug mit dem vorherigen identisch ist, handelt es sich um eine Fortsetzung einer bereits gestarteten Gruppe. Drucken Sie daher einfach die gespeicherte (vorherige) Zeile und erstellen Sie eine neue
saved
Zeichenfolge, die der aktuellen Zeile mit der Breite des aktuellen Einzugs entspricht Tag, das zwischen dem Einzug und dem Text eingefügt wird. Andernfalls starten wir eine neue Gruppe. Erstellen Sie daher einesaved
Zeichenfolge, die die aktuelle Zeile mit dem Starttag (selbst) zwischen dem Einzug und dem Text darstellt.Wenn wir am Ende der Eingabe angelangt sind, beenden Sie die aktuelle Gruppe wie zuvor.
quelle