
Ich habe eine Textdatei ähnlich dem folgenden Beispiel.
Ich möchte einfügen
<string>insert-me</string>
an der angegebenen Zeile.
Wie kann ich das machen? Ich habe ähnliche Varianten ausprobiert:
sed "/s/<key>first</key>/\n <array>/\n/test/g" test.txt
und ich erhalte ständig die Fehlermeldung „falsches Flag im Ersatzbefehl“.
Danke
Beispieltextdatei:
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>
Antwort1
Hier gibt es mehrere Probleme (über das allgemeine Problem hinaus, strukturierte Daten mit Regex-Tools zu analysieren).
Wenn Ihr Muster (oder Ersatz) Schrägstriche enthält, müssen Sie entweder ein anderes Trennzeichen für die sed-Befehle verwenden oder die Schrägstriche maskieren.
sed ist (normalerweise) zeilenorientiert, so dass Sie keine Übereinstimmungen über Zeilengrenzen hinweg erzielen können, es sei denn, Sie ziehen zusätzliche Zeilen in den Musterraum mit
N
Das Anpassen bestimmter Mengen an Leerzeichen wird das Ganze noch fragiler machen
Sie könnten beispielsweise Folgendes tun:
sed '/<key>second<\/key>/ {N; s/\n[[:blank:]]*<array>/&\n\tinsert-me/;}' test.txt
oder (natürlicher) durchAppen stattSErsatz
sed -e '/<key>second<\/key>/ {N; /<array>/ a\\tinsert-me' -e ';}' test.txt
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
insert-me
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>