¿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?

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.