Как вставить строку в текстовый файл в указанное место с помощью sed+regex?

Как вставить строку в текстовый файл в указанное место с помощью sed+regex?

У меня есть текстовый файл, похожий на пример ниже.

Я хочу вставить

<string>insert-me</string>

на указанной линии.

Как это сделать? Я пробовал варианты, похожие на этот:

sed "/s/<key>first</key>/\n        <array>/\n/test/g" 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>
        <string>its</string>
        <string>me</string>
        <string>again</string>
        <string>hello</string>
        <string>world</string>
        <string>again</string>
    </array>
</record>

решение1

Здесь есть несколько проблем (помимо общей проблемы анализа структурированных данных с помощью инструментов регулярных выражений)

  1. если ваш шаблон (или замена) содержит слеши, то вам нужно либо использовать другой разделитель для команд sed, либо экранировать слеши

  2. sed (обычно) ориентирован на строки, поэтому вы не сможете выполнить сопоставление за пределами строк, если только не добавите дополнительные строки в пространство шаблона с помощьюN

  3. сопоставление определенного количества пробелов сделает все это еще более хрупким

Например, вы можете сделать следующее:

sed '/<key>second<\/key>/ {N; s/\n[[:blank:]]*<array>/&\n\tinsert-me/;}' test.txt

или (что более естественно) используяаприложить, а несзаменитель

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>

Связанный контент