
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)
Si su patrón (o reemplazo) contiene barras, entonces necesita usar un separador diferente para los comandos sed o escapar de las barras.
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 con
N
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>