Imprimindo e excluindo a primeira linha de um arquivo usando 'sed'

4

Eu posso imprimir a primeira linha de um arquivo usando

sed -n 1p file.txt

Eu posso excluir a primeira linha de um arquivo usando

sed -i 1d file.txt

Existe uma maneira de imprimir e excluir em sed ? Tipo como um FIFO pop() ou Perl shift .

    
por Andrew Cheong 08.01.2014 / 06:59

3 respostas

6

Você pode usar o comando w para gravar algumas linhas em um arquivo de saída diferente. No Linux e em muitas outras variantes unix, /dev/stdout é a saída padrão do programa, que não é onde o sed escreve com a opção -i . Se o seu sistema não tiver /dev/stdout ou uma variante como /dev/fd/1 , você poderá gravar em um pipe nomeado.

sed -i -e '1 w /dev/stdout' -e '1d' file.txt
    
por 09.01.2014 / 00:33
0

Infelizmente isso não é possível. Essencialmente, você está pedindo que a saída do sed vá para dois lugares diferentes: você deseja que a primeira linha seja impressa no stdout de sed e que as linhas restantes sejam colocadas de volta o arquivo em si. Mas a saída do sed só pode ir para um lugar (por padrão ele vai para stdout , e se você especificar a opção -i , ele volta para o arquivo).

Felizmente, não vejo nenhuma desvantagem de executar os dois comandos separadamente.

    
por 08.01.2014 / 07:10
0

Esta resposta é uma extensão da resposta de Gilles.

A necessidade de escrever o endereço duas vezes não é muito DRY, e embora funcione bem para esse exemplo de apenas excluir a primeira linha, esse método se torna mais problemático se você tiver um padrão de pesquisa mais complicado para as linhas que deseja "extrair" de um arquivo. Em vez de escrever o endereço duas vezes, você pode usar chaves para fazer os dois comandos w e d no mesmo endereço. Usando o exemplo original, ficaria assim:

sed -i -e '1{w /dev/stdout' -e 'd}' file.txt

ou mais geralmente:

sed -i -e '/some long regex/{w /dev/stdout' -e 'd}' file.txt
    
por 07.05.2018 / 19:47

Tags