GNU/Linux >> Tutoriales Linux >  >> Linux

¿Reemplazar líneas que coinciden con un patrón con líneas de otro archivo en orden?

Quiero reemplazar las líneas que coinciden con un patrón de un archivo de las líneas en orden de otro archivo, por ejemplo, dado:

archivo1.txt :

aaaaaa
bbbbbb
!! 1234
!! 4567
ccccc
ddddd
!! 1111

nos gusta reemplazar las líneas que comienzan con !! con las líneas de este archivo:

archivo2.txt :

first line
second line
third line

por lo que el resultado debería ser:

aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line

Respuesta aceptada:

Fácil se puede hacer con awk

awk '
    /^!!/{                    #for line stared with `!!`
        getline <"file2.txt"  #read 1 line from outer file into $0 
    }
    1                         #alias for `print $0`
    ' file1.txt

Otra versión

awk '
    NR == FNR{         #for lines in first file
        S[NR] = $0     #put line in array `S` with row number as index 
        next           #starts script from the beginning
    }
    /^!!/{             #for line stared with `!!`
        $0=S[++count]  #replace line by corresponded array element
    }
    1                  #alias for `print $0`
    ' file2.txt file1.txt

Linux
  1. ¿Eliminar eficientemente el primer par de líneas de un archivo de texto?

  2. ¿Mantener solo la primera línea de cada secuencia de líneas consecutivas que coincidan con un patrón?

  3. ¿Duplicar, con unos pequeños cambios, unas pocas líneas en un archivo de texto?

  4. Lectura de líneas de un archivo con Bash:para vs. ¿Mientras?

  5. Eliminación de líneas específicas de un archivo en la línea de comandos de Linux

Cómo enviar un correo electrónico con un archivo adjunto desde la línea de comandos

Cómo quitar líneas de un archivo usando el comando Sed

¿Reemplazar una línea con otro contenido usando Sed y paralelo para un archivo grande?

¿Reemplazar rango de líneas con rango de líneas (sed u otros)?

¿Cómo agregar varias líneas a un archivo?

Linux:grep desde ciertas líneas hasta el final del archivo