
Quiero reemplazar parte de los datos de un archivo con datos de otro archivo.
Supongamos file1
que tiene datos como se escribe a continuación y file2
tiene algunos datos que quiero almacenar y reemplazar file1
desde file2
el patrón inicial: // +++ CUSTOMIZATION SETTINGS START +++
y el patrón final // +++ CUSTOMIZATION SETTINGS END +++
:.
En file1
:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WE WILL BE ON LEAVE FOR TODAY
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONA
En file2
:
MANISH
MADHVI
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
NISHA
TUSHAR
Como file3
salida:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONA
Respuesta1
$ awk '/SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}} FNR==NR{next} /SETTINGS START/{print substr(a,2)} /SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next} 1' file2 file1
ANJALI NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI MONA
Explicación
awk
implícitamente recorre los archivos línea por línea. En este caso, hacemos que recorra primero el archivo 2 y luego el archivo 1.
/SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}}
La sección de configuración del archivo 2 se captura en la variable
a
.FNR==NR{next}
Si todavía estamos leyendo el archivo 2, omita el resto de los comandos y salte a la siguiente línea de entrada.
/SETTINGS START/{print substr(a,2)}
Si llegamos aquí, estamos procesando el archivo1. Cuando veamos el inicio del apartado de configuración imprimimos la cadena que tenemos guardada en la variable
a
./SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next}
Si estamos en la sección de configuración del archivo1, omita el resto de los comandos y vaya a la siguiente línea de entrada.
1
1
es la abreviatura críptica de awk para imprimir la línea actual. Solo llegamos a esta declaración si estamos en el archivo 1 pero no en la sección de configuración.