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

1

Eu tenho um arquivo de texto semelhante ao exemplo abaixo.

Eu quero inserir

<string>insert-me</string>

na linha indicada.

Como posso fazer isso? Eu tentei variações semelhantes a esta:

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

e continuo recebendo o erro "bad flag in substitute command".

Obrigado

arquivo de texto de amostra:

<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>
    
por mrjayviper 02.06.2018 / 14:17

1 resposta

2

Existem vários problemas aqui (além do geral de tentar analisar dados estruturados com ferramentas de expressão regular)

  1. se o seu padrão (ou substituição) contém barras, então você precisa usar um separador diferente para os comandos sed ou escapar das barras

  2. sed é (normalmente) orientado a linhas, portanto você não pode cruzar os limites de linha a menos que você atraia linhas adicionais para o espaço de padrão com N

  3. correspondência de quantidades específicas de espaço em branco tornará a coisa toda ainda mais frágil

Por exemplo, você poderia fazer:

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

ou (mais naturalmente) usando a ppend em vez de s ubstitute

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>
    
por 02.06.2018 / 14:59