Como esse comando sed funciona?

12

Encontrei esta solução para imprimir uma linha específica a partir de um arquivo de texto:

sed '123!d;q' file

Por que o sed não sai após a primeira linha de entrada nesse caso?

Eugene Yarmash
fonte

Respostas:

20

Em inglês, este sedprograma significa: para cada linha,

  • [ 123!] se o número da linha atual não for 123, [ d] exclua a linha atual e inicie o próximo ciclo (ou seja, vá para a próxima linha);
  • então (mas só chegamos a esse ponto se o dcomando não foi executado), [ q] sai sem processar mais linhas (mas imprima a linha atual em nossas agonias).

Ou, se preferir, na sintaxe do shell:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done
Gilles 'SO- parar de ser mau'
fonte
Obrigado, isso também me esclareceu. Meu erro foi que eu entendi que !estava conectado d, não 123.
rozcietrzewiacz
@ Gilles: faltando o aparelho {d;q;}, não deve qaplicar a todas as linhas (tão somente a primeira)?
enzotib 18/11/11
1
O @enzotib qse aplica a todas as linhas em que é executado. Mas quando o número da linha não é 123, o dcomando é executado e seu significado é pular imediatamente para a próxima linha de entrada.
Gilles 'SO- stop be evil'
Explicação clara
Rahul Patil
Essencialmente, ele faz o mesmo que sed -n 123p(imprime a mesma saída), exceto que para após a linha 123, em vez de processar potencialmente milhares de linhas a mais que nunca fará nada.
Curinga