Como inserir uma linha em um arquivo de texto em um local designado usando sed+regex?

Como inserir uma linha em um arquivo de texto em um local designado usando sed+regex?

Eu tenho um arquivo de texto semelhante ao exemplo abaixo.

eu quero inserir

<string>insert-me</string>

na linha indicada.

Como eu posso fazer isso? Tentei variações semelhantes a esta:

sed "/s/<key>first</key>/\n        <array>/\n/test/g" test.txt

e continuo recebendo o erro "sinalizador incorreto no comando substituto".

Obrigado

arquivo de texto de exemplo:

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

Responder1

Existem vários problemas aqui (além do problema geral de tentar analisar dados estruturados com ferramentas regex)

  1. se o seu padrão (ou substituição) contiver barras, você precisará usar um separador diferente para os comandos sed ou escapar das barras

  2. sed é (normalmente) orientado a linhas, portanto você não pode combinar os limites das linhas, a menos que você puxe linhas adicionais para o espaço do padrão comN

  3. combinar quantidades específicas de espaços em branco tornará tudo ainda mais frágil

Então, por exemplo, você poderia fazer:

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

ou (mais naturalmente) usandoagastar em vez deésubstituto

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>

informação relacionada