Si eres capaz de crear una expresión regular que identifique de forma única la línea del archivo que quieres modificar, entonces sí que es una buena solución usar el modo de reemplazo "in-situ".
Si resulta que '</label>' es la última línea que debes modificar (y es la única del archivo así), entonces ese debe ser tu patrón:
Using bash Syntax Highlighting
perl -p -i -e 's{^</label>$}{.datos nuevos\n.datos nuevos\n</label>}' archivo.txt
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
Lo que está haciendo el programa es abrir archivo.txt y reeditarlo (-i). Para ello, lo lee línea a línea, y a cada una, le aplica la expresión regular de sustitución. Finalmente, imprime la línea resultado (-p) en el propio archivo. Bueno, en realidad escribe el resultado en un archivo temporal y luego le cambia el nombre para sobreescribir el original.
Si la línea que está procesando coincide con el patrón de búsqueda, sustituye lo encontrado por el texto que le sigue. Mira:
Using text Syntax Highlighting
explorer@Arcanus:~/Documentos/Desarrollo > cat kk.txt
<label>
.datos viejos
.datos viejos
</label>
explorer@Arcanus:~/Documentos/Desarrollo > perl -p -i -e 's{^</label>$}{.datos nuevos\n.datos nuevos\n</label>}' kk.txt
explorer@Arcanus:~/Documentos/Desarrollo > cat kk.txt
<label>
.datos viejos
.datos viejos
.datos nuevos
.datos nuevos
</label>
explorer@Arcanus:~/Documentos/Desarrollo >
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
La cuestión, ahora, es cómo realizar esto dentro de un programa.
Primero, hay que activar la variable especial $^I, opcionalmente con el valor de la extensión que se añadirá al archivo original.
Segundo, agregar el archivo original a @ARGV.
Tercero, hacer un bucle por las filas leyéndolas con <>, y usar la expresión regular e imprimir el resultado.
Algo así:
Using perl Syntax Highlighting
#!/usr/bin/env perl
local $^I = '.bak'; # emula -i.bak
local @ARGV = glob("kk.txt"); # initializa lista de archivos
while (<>) {
s{^</label>$}{.datos nuevos\n.datos nuevos\n</label>};
print;
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Este programa genera la misma salida que el uno-línea anterior.
Más información, en
la receta 7.9 del libro Perl CookBook..