Delete Primeira linha de um arquivo

93

Como posso excluir a primeira linha de um arquivo e manter as alterações?

Eu tentei isso, mas apague todo o conteúdo do arquivo.

$sed 1d file.txt > file.txt
    
por kickass13 16.10.2013 / 02:22

11 respostas

68

O motivo file.txt está vazio depois que o comando é a ordem em que o shell faz as coisas. A primeira coisa que acontece com essa linha é o redirecionamento. O arquivo "file.txt" é aberto e truncado para 0 bytes. Depois disso, o comando sed é executado, mas no momento em que o arquivo já está vazio.

Existem algumas opções, a maioria envolve a gravação em um arquivo temporário.

sed '1d' file.txt > tmpfile; mv tmpfile file.txt # POSIX
sed -i '1d' file.txt # GNU sed only, creates a temporary file

perl -ip -e '$_ = undef if $. == 1' file.txt # also creates a temporary file
    
por 16.10.2013 / 02:29
123

Uma opção alternativa muito leve é apenas 'rabiscar' tudo, exceto a primeira linha (isso pode ser uma maneira fácil de remover cabeçalhos de arquivo em geral):

# -n +2 : start at line 2 of the file.
tail -n +2 file.txt > file.stdout

Seguindo @Evan Teitelman, você pode:

tail -n +2 file.txt | sponge file.txt

Para evitar um arquivo temporário. Outra opção pode ser:

echo "$(tail -n +2 file.txt)" > file.txt

E assim por diante. Testando o último:

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ echo "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5
[user@work ~]$ 

Ops perdemos uma nova linha (por @ 1CR comentário abaixo), tente:

printf "%s\n\n" "$(tail -n +2 file.txt)" > file.txt

[user@work ~]$ cat file.txt
line 1
line 2
line 3
line 4
line 5

[user@work ~]$ printf '%s\n\n' "$(tail -n +2 file.txt)" > file.txt
[user@work ~]$ cat file.txt
line 2
line 3
line 4
line 5  

[user@work ~]$ 

Voltando ao sed, tente:

printf '%s\n\n' "$(sed '1d' file.txt)" > file.txt

ou talvez

echo -e "$(sed '1d' file.txt)\n" > file.txt

Para evitar efeitos colaterais.

    
por 16.10.2013 / 13:32
15

Veja também sponge de moreutils . sponge absorve dados de entrada padrão até que a extremidade da escrita da entrada padrão seja fechada antes de gravar em um Arquivo. É usado assim:

sed '1d' file.txt | sponge file.txt
    
por 16.10.2013 / 02:43
13

Este tópico é interessante, por isso testo o benchmark de 3 formas:

  1. sed '1d' d.txt > tmp.txt
  2. tail -n +2 d.txt > tmp.txt
  3. sed -i '1d' d.txt

Observe que o destino d.txt é um arquivo de 5,4 GB

Obtenha o resultado:

run 1 : sed '1d' d.txt > r1.txt
14s
run 2 : tail -n +2 d.txt > r2.txt
20s
run 3 : sed -i '1d' d.txt
88s

Conclusão: parece abaixo o caminho mais rápido:

sed '1d' file.txt > tmpfile; mv tmpfile file.txt

    
por 10.06.2015 / 06:04
9

ex pode ser usado para edição real no local que não envolve um arquivo temporário

ex -c ':1d' -c ':wq' file.txt
    
por 16.10.2013 / 03:03
3

Você pode usar o Vim no modo Ex:

ex -s -c '1d|x' file.txt
  1. 1 encontra a primeira linha

  2. d delete

  3. x salvar e fechar

por 11.04.2016 / 02:01
1

A maneira mais curta e simples de excluir a primeira linha de um arquivo usando sed é:

$ sed -i -n -e '2,$p' file.txt
    
por 13.12.2016 / 10:55
0

Este comando removerá 1 linha e salvará como "arquivo.txt".

sed '1d' file.txt  > /tmp/file.txt && mv /tmp/file.txt file.txt || rm -f /tmp/file.txt
    
por 21.10.2013 / 09:53
0

Para excluir uma linha do praticiler no arquivo

  1. Excluir primeira linha

Arquivo '1d' de Sed

  1. Excluir primeira e terceira linha

Arquivo '1d3d' de Sed

Excluir o caractere na linha

1 Delete Primeiro dois charter em lin

O arquivo de /^..// 'de Sed

2 Apagar as duas últimas linhas de chrectercin

Sed 's / .. £ //' arquivo

3 Excluir linha em branco

Sed '/ ^ £ / d' arquivo

    
por 22.10.2015 / 07:30
0

Poderia usar o vim para fazer isso:

vim -u NONE +'1d' +wq! /tmp/test.txt
    
por 17.10.2017 / 16:28
-2

cat file01 | sed -e '1,3d'

// mostra o conteúdo em file01, mas remove a primeira e a terceira linha

    
por 10.02.2017 / 02:24