Reemplazar líneas que coincidan con un patrón con líneas de otro archivo en orden

Reemplazar líneas que coincidan 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

entonces el resultado debería ser:

aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line

Respuesta1

Fácil se puede hacer conawk

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

Respuesta2

Con GNU sed, similar aawk+getline

$ sed -e '/^!!/{R file2.txt' -e 'd}' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
  • Rdaría una línea una a la vez
  • El orden es importante, primero Ry luego.d


Conperl

$ < file2.txt perl -pe '$_ = <STDIN> if /^!!/' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
  • pasar el archivo con líneas de reemplazo como entrada estándar, para que podamos leerlo usando <STDIN>filehandle
  • si se encuentra una línea coincidente, reemplácela $_con una línea de la entrada estándar

información relacionada