Por que o '1,4p' está exibindo todas as linhas em vez de apenas as quatro primeiras?

1

Eu tenho um arquivo de texto chamado "lista", que contém algumas palavras aleatórias:

he
she
we
his
her
with
his this this -- this
this

Eu executei este comando sed:

sed '1,4p' list

O que eu pensei que este comando sed iria fazer era listar as primeiras 4 palavras neste arquivo, então eu pensei que a saída seria:

he
she
we
his

Mas a saída foi esta:

he
he
she
she
we
we
his
his
her
with
his this this -- this
this

Alguém pode me dizer o que estou fazendo errado ou porque a saída é diferente?

    
por Scott Pearce 09.04.2015 / 19:22

3 respostas

13

Você está esquecendo que a ação padrão do sed é imprimir cada espaço de padrão (linha) - para suprimir o comportamento padrão, é necessário adicionar o -n switch

sed -n '1,4p' list
    
por 09.04.2015 / 19:26
3

Use isto:

sed -n 1,4p list

ou isto:

sed '1,4!d' list

Mais exemplos

    
por 09.04.2015 / 19:29
1

O que faz em geral

Sua expressão de script será executada em cada linha.

Para executar expressões em uma linha, sed primeiro copiará para o espaço padrão .
Em seguida, todas as expressões são executadas, cada uma usando o espaço de padrão como entrada e gravando o resultado de volta no espaço de padrão.

Então, normalmente, quando as etapas de trabalho da linha são concluídas, temos uma string final no espaço padrão. Na maioria dos casos, queremos apenas isso como saída, por exemplo, depois que ele foi alterado por vários comandos s// .
Como geralmente é útil, sed imprime o espaço do padrão final, como se fosse anexar uma expressão p .

Você já pode ver que isso causa a saída do seu comando.

  • A linha é colocada no espaço de padrões
  • Seu script imprime o espaço padrão para quatro linhas correspondentes usando p
  • Ele não atualiza o espaço do padrão quando termina.
  • Como já está no final da lista de expressões, o espaço do padrão é impresso, porque é feito por padrão

Note que ele está exibindo "todas as linhas e as quatro primeiras" - ao contrário de "todas as linhas em vez de apenas as quatro primeiras".

Assim, das linhas repetidas, o primeiro de cada uma é o que você imprimiu, e o segundo é o que é impresso por padrão.

A sed option -n ( --quiet ) alterna o padrão de impressão do espaço de padrão:

sed -n 1,4p list

Para ver o que seu comando original está fazendo, podemos fazer os dois tipos de linhas parecerem diferentes: alteramos o espaço do padrão antes de imprimi-lo no final, prefixando-o com - :

$ sed -e '1,4p' -e 's/^/- /'  list
he
- he
she
- she
we
- we
his
- his
- her
- with
- his this this -- this
- this

(As opções -e são necessárias para fornecer várias expressões. 's / ^ / - /' não substitui nada no início da linha por - .)

    
por 27.04.2015 / 04:04

Tags