¿Cómo insertar una línea en un archivo de texto en un lugar designado usando sed+regex?

¿Cómo insertar una línea en un archivo de texto en un lugar designado usando sed+regex?

Tengo un archivo de texto similar al siguiente ejemplo.

quiero insertar

<string>insert-me</string>

en la línea indicada.

¿Cómo puedo hacerlo? Probé variaciones similares a esta:

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

y sigo recibiendo el error "bandera incorrecta en comando sustituto".

Gracias

archivo de texto de muestra:

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

Respuesta1

Hay varios problemas aquí (más allá del general de intentar analizar datos estructurados con herramientas de expresiones regulares)

  1. Si su patrón (o reemplazo) contiene barras, entonces necesita usar un separador diferente para los comandos sed o escapar de las barras.

  2. sed está (normalmente) orientado a líneas, por lo que no puede hacer coincidir los límites de las líneas a menos que introduzca líneas adicionales en el espacio del patrón conN

  3. hacer coincidir cantidades específicas de espacios en blanco hará que todo sea aún más frágil

Entonces, por ejemplo, podrías hacer:

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

o (más naturalmente) usandoaañadir en lugar dessustituir

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>

información relacionada