Wie fügt man mit sed+regex an einer bestimmten Stelle eine Zeile in eine Textdatei ein?

Wie fügt man mit sed+regex an einer bestimmten Stelle eine Zeile in eine Textdatei ein?

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).

  1. 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.

  2. 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 mitN

  3. 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>

verwandte Informationen