
Quero substituir as linhas que correspondem a um padrão de um arquivo das linhas em ordem de outro arquivo, por exemplo, dado:
arquivo1.txt:
aaaaaa
bbbbbb
!! 1234
!! 4567
ccccc
ddddd
!! 1111
gostamos de substituir as linhas que começam com !! com as linhas deste arquivo:
arquivo2.txt:
first line
second line
third line
então o resultado deve ser:
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
Responder1
Fácil pode ser feito comestranho
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
Responder2
Com GNU sed
, semelhante aawk+getline
$ sed -e '/^!!/{R file2.txt' -e 'd}' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
R
daria uma linha, uma de cada vez- a ordem é importante, primeiro
R
e depoisd
Comperl
$ < file2.txt perl -pe '$_ = <STDIN> if /^!!/' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
- passe o arquivo com linhas de substituição 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