¿Cómo funciona este comando sed?

12

He encontrado esta solución para imprimir una línea específica desde un archivo de texto:

sed '123!d;q' file

¿Por qué no se cierra después de la primera línea de entrada en este caso?

Eugene Yarmash
fuente

Respuestas:

20

En inglés, este sedprograma significa: para cada línea,

  • [ 123!] si el número de línea actual no es 123, entonces [ d] borra la línea actual y comienza el siguiente ciclo (es decir, pasa a la siguiente línea);
  • entonces (pero solo llegaremos a este punto si el dcomando no se ejecutó), [ q] salga sin procesar más líneas (pero imprima la línea actual en nuestra agonía).

O si lo prefiere, en sintaxis de 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- deja de ser malvado'
fuente
Gracias, eso también me lo aclaró. Mi error fue que entendí que !estaba conectado d, no 123.
rozcietrzewiacz
@Gilles: faltan las llaves {d;q;}, ¿no debería qaplicarse a todas las líneas (así que solo a la primera)?
enzotib
1
@enzotib se qaplica a cada línea donde se ejecuta. Pero cuando el número de línea no es 123, el dcomando se ejecuta y su significado es saltar inmediatamente a la siguiente línea de entrada.
Gilles 'SO- deja de ser malvado'
Explicación clara como el cristal
Rahul Patil
Esencialmente hace lo mismo que sed -n 123p(imprime la misma salida), excepto que se detiene después de la línea 123 en lugar de procesar potencialmente miles de líneas más con las que nunca hará nada.
Comodín