<
Wie kann ich meinen Daten eine neue Zeile hinzufügen ?
Mein aktuelles Datum sieht so aus
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0" <VALUE MAGID="2" MAGNAME="Heal" TYPE="4" <VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7" <VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7" <VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
Die Ausgabe sollte
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0"
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4"
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7"
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7"
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
Antwort1
Um Textmuster zu ersetzen, können Sie sed
den Befehl "s" verwenden, wie in
sed 's/foo/bar/g'
Dadurch werden alle Vorkommen von foo
durch ersetzt bar
.
Um insbesondere vor jedem eine neue Zeile einzufügen <
, könnten Sie
echo '<value ... <value ...' | sed 's/</\n</g'
Wenn Sie nicht möchten, dass die neue Zeile ganz am Anfang hinzugefügt wird, können Sie stattdessen Folgendes tun:
echo '<value ... <value ...' | sed 's/\(.\)</\1\n</g'
Antwort2
sed 's/</\n&/g'
s
Argument sagt sed, dass es einString[Text]- sed verwendet dieses Format
/selectText/ReplaceText/
--> Beispiel:/<//
Dies entfernt das Symbol<
, nur das erste<
- Um alles auszuwählen,
<
verwenden Sie das Argumentg
am Ende Ihrer/select/replace/g
, was bedeutet, dass Sie alles ersetzen, was Sie finden, z. B. alles ersetzen<
\n
Argument zum Hinzufügen einesNeue Zeilees muss mit\
Backslash geschrieben werden&
Argument weist sed an, alles zu kopieren und einzufügennachwas in diesem Fall ausgewählt wurde,<
WERT...
Antwort3
Wenn Sie GNU haben, können Sie es wie in den anderen Antworten vorgeschlagen machen sed
:
sed 's/</\n</g' file
Wenn Sie jedoch nicht über GNU verfügen , z. B. unter macOS oder einem anderen BSD-System, müssen Sie im Ersetzungstext sed
möglicherweise anstelle der Escape-Sequenz einen wörtlichen Zeilenumbruch verwenden :\n
sed 's/</\
</g' file
Das sieht ein wenig hässlich aus, sed
wird vom Standard aber einfach nicht \n
als etwas anderes als „ein wörtliches n
Zeichen“ im Ersetzungstext erkannt.
Sie können die hässliche Syntax umgehen, indem Sie den y///
Befehl verwenden, um alle <
durch Zeilenumbrüche zu ersetzen (hier:\n
Istals „Newline“ erkannt) und fügen Sie die <
Zeichen anschließend erneut ein:
sed -e 'y/</\n/' -e 's/\n/&</g' file
Um die erste resultierende Zeile herauszufiltern, die leer sein wird, führen Sie eine Pipe durch tail -n +2
:
$ sed -e 'y/</\n/' -e 's/\n/&</g' file | tail -n +2
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0"
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4"
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7"
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7"
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
... aber im Idealfall würden Sie einen XML-Parser wie diesen verwenden xmlstarlet
oder xq
auf der ursprünglichen XML-Datei, so wie sie aussah, bevor Sie versucht haben, sie für die Analyse mit zeilenorientierten Tools neu zu formatieren.