Tengo una serie de archivos que quiero actualizar reemplazando una cadena de varias líneas con otra cadena de varias líneas. Algo en la línea de:
* Some text,
* something else
* another thing
Y quiero reemplazarlo con:
* This is completely
* different text
El resultado sería que después del reemplazo, el archivo que contiene el primer bloque de texto ahora contendrá la segunda cadena (el resto del archivo no cambia).
Parte del problema es que tengo que encontrar la lista de archivos que se actualizarán en el sistema de archivos. Supongo que puedo usar grep para eso (aunque, de nuevo, eso no es tan fácil de hacer con cadenas multilínea) y luego conectarlo en sed, ¿tal vez?
¿Hay una forma fácil de hacer esto? Sed es una opción, pero es incómodo porque tengo que agregar \ n, etc. ¿Hay alguna forma de decir "tomar la entrada de este archivo, emparejarla en esos archivos y luego reemplazarla por el contenido de este otro archivo"? Puedo usar Python si es necesario, pero quiero algo rápido y simple, así que si hay una utilidad disponible, prefiero usarla que escribir mi propio script (que sé cómo hacer).
some text, something else another thing
si abarca o no varias líneas? ¿O solo quieres unirsome text,\nsomething else\nanotherthing
?Respuestas:
Sustituya "Some ... \ n ... Thing" por el contenido del archivo "new" en uno o más archivos de entrada
-i
para cambiar input.txt directamente-p0
sorber el archivo de entrada e imprimirlo al finals/regexp/.../s
en regexp.
es.|\n
s/.../exp/e
sustituir poreval(exp)
s/Some text\n...\n...thing\n/...
fuente
perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
Me temo que va a tener dificultades para encontrar una solución que se adapte a usted hasta que elabore una descripción concreta del problema, pero eso es lo que el QA es más adecuado, según lo veo. Tal vez esto le dará una idea: siempre mantendrá 3 líneas en el espacio del patrón a la vez, con una anticipación de 2 líneas, mientras se desliza hacia adelante a través del archivo de entrada solo una línea a la vez.
Debe poder hacer coincidir su cadena, ya sea que abarque varias líneas o no, hasta tres, es decir. Pero no hay disposiciones para reflejar esa disposición en el reemplazo; siempre abarca dos líneas tal como están escritas.
fuente
No es muy fuerte (porque no cheches la segunda cuerda pero es fácil de asentar) y puede ser que no sea compatible con posix, pero es muy simple:
El primer comando agrega líneas desde Algún texto hasta que haya encontrado otra cosa, luego la segunda línea lo cambia a otro texto.
NOTA La limitación es que algún texto siempre debe ir seguido de otra cosa .
fuente