Como copiar o restante das linhas de um arquivo para outro arquivo [duplicado]
772
Eu tenho a string xyzque é uma linha file1.txt, quero copiar todas as linhas depois xyzpara file1.txtum novo arquivo file2.txt. Como posso conseguir isso?
Eu sei sobre cato comando. Mas como especificar a linha de partida?
1,/xyz/especifica um intervalo de linhas começando com a primeira e terminando com a primeira ocorrência de uma linha correspondente xyz. ddiz ao sed para deletar essas linhas.
Nota: Para sed BSD/MacOS, pode-se usar, sed '1,/xyz/d' file1.txt >file2.txtmas isso só funciona se a primeira aparição de xyzestiver na segunda linha ou posterior. (Dica de chapéu: kusalananda .)
Outra abordagem, como sugerida por don_crissti , deve funcionar para todos os sed:
{ printf %s\\n; cat file1.txt; } | sed '1,/xyz/d' >file2.txt
Exemplo
Considere este arquivo de teste:
$ cat file1.txt
a
b
xyz
c
d
Execute nosso comando:
$ sed '1,/xyz/d' file1.txt >file2.txt
$ cat file2.txt
c
d
Usando awk
A mesma lógica pode ser usada com o awk:
awk 'NR==1,/xyz/{next} 1' file1.txt >file2.txt
NR==1,/xyz/{next}diz ao awk para pular todas as linhas da primeira ( NR==1) até a primeira linha correspondente à regex xyz. 1diz ao awk para imprimir quaisquer linhas restantes.
Com -nevitamos sedimprimir todas as linhas. Com $meios fim de arquivo final psignifica linha de impressão. Então /xyz/$psignifica: Se uma linha corresponder xyz, imprima-a até o final do arquivo.
Usando GNU sed
Para copiar todas as linhas após
xyz
, tente:1,/xyz/
especifica um intervalo de linhas começando com a primeira e terminando com a primeira ocorrência de uma linha correspondentexyz
.d
diz ao sed para deletar essas linhas.Nota: Para sed BSD/MacOS, pode-se usar,
sed '1,/xyz/d' file1.txt >file2.txt
mas isso só funciona se a primeira aparição dexyz
estiver na segunda linha ou posterior. (Dica de chapéu: kusalananda .)Outra abordagem, como sugerida por don_crissti , deve funcionar para todos os sed:
Exemplo
Considere este arquivo de teste:
Execute nosso comando:
Usando awk
A mesma lógica pode ser usada com o awk:
NR==1,/xyz/{next}
diz ao awk para pular todas as linhas da primeira (NR==1
) até a primeira linha correspondente à regexxyz
.1
diz ao awk para imprimir quaisquer linhas restantes.Com
ed
:Isso envia um comando (variado) para
ed
: da linha após (+1
) aquela que contémxyz
até o final do arquivo ($
),w
rite essas linhas parafile2.txt
.Há também csplit :
Com
-n
evitamossed
imprimir todas as linhas. Com$
meios fim de arquivo finalp
significa linha de impressão. Então/xyz/$p
significa: Se uma linha corresponderxyz
, imprima-a até o final do arquivo.