O que a opção `-n` no sed faz?

13

Esta é a entrada da página de manual para -n:

-n

suprimir a impressão automática do espaço do padrão

Percebo que, quando não está sendo usado -npara determinadas operações, cada linha é impressa em stdout (e as linhas solicitadas são impressas duas vezes):

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

No entanto, esta lei não se aplica a outros comandos:

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

Então, o que -nfaz exatamente?

dotancohen
fonte

Respostas:

17

Normalmente, o sed processa cada linha (fazendo substituições etc.) e depois imprime o resultado. Se o processamento envolver a linha que está sendo impressa (por exemplo, pcomando sed ), ela será impressa duas vezes (uma vez durante o processamento, e novamente pela impressão automática de pós-processamento). A -nopção desativa a impressão automática, o que significa que as linhas que você não diz especificamente para imprimir não são impressas e as linhas que você diz explicitamente para imprimir (por exemplo, com p) são impressas apenas uma vez.

  • sed -n '2,3p' test.txt - imprime apenas as linhas 2 a 3, conforme solicitado

  • sed '2,3p' test.txt - imprime cada linha (automaticamente) E TAMBÉM imprime linhas 2 a 3 uma segunda vez

  • sed -n 's/t/T/' test.txt - substitui "t" por "T" em cada linha, mas não imprime o resultado devido a -n

  • sed 's/t/T/' test.txt - substitui "t" por "T" em cada linha e imprime automaticamente o resultado

E deixe-me adicionar mais alguns exemplos:

  • sed -n 's/t/T/p' test.txt - substitui "t" por "T" em cada linha, imprime APENAS as linhas em que a substituição ocorreu (ou seja, não "segunda")

  • sed 's/t/T/p' test.txt - substitui "t" por "T" em cada linha, imprime as linhas onde a substituição ocorreu e depois imprime automaticamente cada linha (resultado: "segundo" é impresso uma vez, todos os outros duas vezes)

  • sed '2,3p; 3p' test.txt- imprime as linhas 1, 4 e 5 uma vez (a impressão automática); linha 2 duas vezes (o primeiro pcomando e depois a impressão automática) e linha 3 três vezes (uma vez para cada pcomando e depois automaticamente).

Gordon Davisson
fonte
Obrigado Gordon, mas sua avaliação apenas repete minha observação. Nos dois primeiros exemplos, sed sem -nimprime todas as linhas, além daquelas solicitadas especificamente. Assim, nesse caso, -n suprime a impressão de cada linha analisada . No entanto, no terceiro e quarto exemplos, o comportamento é diferente. Nesses casos, sed sem -nnão gera as linhas duas vezes, portanto, o uso -nnão suprime a impressão de todas as linhas analisadas, mas suprime a impressão de linhas não alteradas . Estou tendo dificuldade em generalizar quando o comportamento será um ou outro.
dotancohen
Não, em ambos os casos -nestá fazendo exatamente a mesma coisa: alternar de cada linha impressa automaticamente (e o modificador pe ppara um comando substituto fazem com que a linha seja impressa mais vezes) para um modo em que as linhas são impressas apenas se você especificar especificamente para (com o pcomando etc).
Gordon Davisson
Dito de outra maneira: tente adicionar a -nopção AND TAMBÉM adicionar ; pao comando sed (por exemplo sed -n '2,3p; p', e você obterá os mesmos resultados que obteria sem os dois. Isso -nsuprime a impressão automática padrão e ; padiciona uma explícita (principalmente equivalente )
Gordon Davisson
Eu vejo agora, obrigado. Eu aprecio muito que você dedique algum tempo para ajudar a tornar o exemplo explícito. Tenha uma ótima semana!
dotancohen