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

10

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

Se eu tivesse um arquivo de texto /myPathToTheFile.txt como este

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

Gostaria de obter esta linha como saída

► put returns between paragraphs

e meu arquivo de texto deve estar agora assim

► for linebreak add 2 spaces at end
► _italic_ or **bold*
    
por stacko 25.02.2017 / 04:26

7 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'
    
por 25.02.2017 / 05:06
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 um verso

sed -i -e '1 {w /dev/stdout' -e 'd}' file
    
por 25.02.2017 / 05:14
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
    
por 25.02.2017 / 04:58
5
sed -ne '1p' -e '1!s/^//w temp_file' yourfile && mv temp_file yourfile
    
por 25.02.2017 / 05:09
2

Você pode usar head , tail e mv :

Exibe a primeira linha:

head -1 myPathToTheFile.txt

Mantendo as últimas linhas ( +2 ):

tail -n +2 myPathToTheFile.txt > file.tmp && mv file.tmp myPathToTheFile.txt
    
por 26.02.2017 / 11:59
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
    
por 28.02.2017 / 20:50
1

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

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

Nota: Assegure-se de que não exista nenhum arquivo tmp existente na pasta atual, senão ele será removido.

Explicação:

  • "head -1" seleciona a primeira linha
  • "tail -n + 2 target.txt > tmp" seleciona todas as linhas de 2 em diante (incluindo) e as coloca no tmp
  • mv sobrescreve o arquivo original com tmp
  • rm tmp irá remover o arquivo tmp assim criado
por 01.03.2017 / 05:22