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
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?
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.
p
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 -
.)
Tags sed