Como obter a primeira linha de um arquivo de texto de entrada, enquanto exclui essa linha do arquivo de texto

11

Como posso obter a primeira linha de um arquivo de texto de entrada, excluindo essa linha do arquivo de texto?

Se eu tivesse um arquivo de texto /myPathToTheFile.txtcomo este

► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

Eu gostaria de obter esta linha como uma saída

► put returns between paragraphs

e meu arquivo de texto deve estar assim agora

► for linebreak add 2 spaces at end
► _italic_ or **bold*
stacko
fonte
Observe que o custo desta operação é proporcional ao tamanho do arquivo. Portanto, se o arquivo for grande e você fizer isso com frequência, será muito lento.
CodesInChaos

Respostas:

13
ex -s /myPathToTheFile.txt <<\EX
1p
1d
wq
EX

ou

ex -s /myPathToTheFile.txt <<< 1p$'\n'1d$'\n'wq

ou, menos digitação:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'
Jeff Schaller
fonte
Uau, bom uso de ed ...!
QWR
10

Pelo menos com o GNU sed:

$ cat file
► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

$ sed -i '1{
w /dev/stdout
d}' file
► put returns between paragraphs

$ cat file
► for linebreak add 2 spaces at end
► _italic_ or **bold**

Com o GNU sed, ele pode ser escrito como uma linha

sed -i -e '1 {w /dev/stdout' -e 'd}' file
chave de aço
fonte
6

Supondo que você esteja solicitando um script de shell, isso fará o que você solicitou:

NAME=$1
head -n 1 $NAME
sed -i '1d' $NAME
Stephen Rauch
fonte
5
sed -ne '1p' -e '1!s/^//w temp_file' yourfile && mv temp_file yourfile
Rakesh Sharma
fonte
2

Você pode usar head, taile mv:

Exiba a primeira linha:

head -1 myPathToTheFile.txt

Mantendo as últimas ( +2) linhas:

tail -n +2 myPathToTheFile.txt > file.tmp && mv file.tmp myPathToTheFile.txt
GAD3R
fonte
1

Usando descritores de arquivos e um pouco de python

{
    { 
    head -n1 >&3; 
    3>&- tail -n +1;
    3>&- python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())';
    }<file 1<>file
} 3>&1
iruvar
fonte
1

Usando cabeça e cauda. O arquivo é target.txt

head -1 target.txt && tail -n+2 target.txt > tmp
mv tmp target.txt && rm tmp

Nota: Verifique se não há arquivo tmp existente na pasta atual, caso contrário ele será removido.

Explicação:

  • "head -1" seleciona a primeira linha
  • "tail -n + 2 target.txt> tmp" seleciona todas as linhas do 2º em diante (incluindo) e as coloca em tmp
  • mv sobrescreve o arquivo original com tmp
  • rm tmp removerá o arquivo tmp criado assim
Valiriano
fonte