Zeile nach Textfeld hinzufügen

Zeile nach Textfeld hinzufügen

<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 sedden Befehl "s" verwenden, wie in

sed 's/foo/bar/g'

Dadurch werden alle Vorkommen von foodurch 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'
  • sArgument 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 Argument gam Ende Ihrer /select/replace/g, was bedeutet, dass Sie alles ersetzen, was Sie finden, z. B. alles ersetzen<
  • \nArgument 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 sedmöglicherweise anstelle der Escape-Sequenz einen wörtlichen Zeilenumbruch verwenden :\n

sed 's/</\
</g' file

Das sieht ein wenig hässlich aus, sedwird vom Standard aber einfach nicht \nals etwas anderes als „ein wörtliches nZeichen“ 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 xmlstarletoder xqauf der ursprünglichen XML-Datei, so wie sie aussah, bevor Sie versucht haben, sie für die Analyse mit zeilenorientierten Tools neu zu formatieren.

verwandte Informationen