Substitua as linhas que correspondem a um padrão por linhas de outro arquivo em ordem

4

Eu quero substituir as linhas correspondentes a um padrão de um arquivo das linhas em ordem de outro arquivo, por exemplo, dado:

file1.txt :

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

gostamos de substituir as linhas que começam com !! com as linhas deste arquivo:

file2.txt :

first line
second line
third line

, então o resultado deve ser:

aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
    
por Msegade 15.10.2016 / 12:32

2 respostas

10

Fácil pode ser feito com awk

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

Outra versão

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
    
por 15.10.2016 / 12:51
0

Com GNU sed , semelhante a awk+getline

$ sed -e '/^!!/{R file2.txt' -e 'd}' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
  • R daria uma linha um de cada vez
  • o pedido é importante, primeiro R e, em seguida, d


Com perl

$ < file2.txt perl -pe '$_ = <STDIN> if /^!!/' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
  • passe o arquivo substituindo as linhas como entrada padrão, para que possamos lê-lo usando <STDIN> filehandle
  • se a linha correspondente for encontrada, substitua $_ por uma linha da entrada padrão
por 16.10.2016 / 07:20