Siguiente Línea: La orden n

Mediante la orden n podemos reemplazar el espacio de patrones actual por la siguiente línea. Si no se ha utilizado la opción -n en la ejecución de sed, el contenido del espacio de patrones se imprimirá antes de ser eliminada. El control pasa al comando siguiendo al comando n y no al primer comando del script. Se trata, por tanto, de una orden que altera la conducta habitual de sed: Lo común es que, cuando se lee una nueva línea, se ejecute el primer comando del guión.

El siguiente ejemplo extrae los comentarios de un programa C. Se asume que, aunque los comentarios se pueden extender sobre varias líneas, no existe mas de un comentario por línea.

$ cat n.sed
# run it with: sed -n -f n.sed n.test
# write commented lines in a C program
#If current line matches /* ...
/\/\*/{
# Comienzo de comentario, aseguremonos que la línea no casa con un cierre
# de comentario.
:loop
/\*\//!{
p
n
b loop
}
p
}
Supongamos el siguiente programa de prueba:
$ cat n.test
#include <stdio.h>
 
fact(int n) { /* recursive function */
if(n == 0) return 1;
else(return n*fact(n-1));
}
 
void toto(id) { /* This function */ /* is
                   still empty */
}
 
main() {
  toto();
  printf("Hello world! factorial of 4 = %d\n",fact(4)); /* the
         comment takes two lines */
  toto();
  /* and here is
     a comment
     extended on 3 lines
  */
}
La salida al ejecutar el programa es la siguiente:
$ sed -n -f n.sed n.test
fact(int n) { /* recursive function */
void toto(id) { /* This function */ /* is
  printf("Hello world! factorial of 4 = %d\n",fact(4)); /* the
         comment takes two lines */
  /* and here is
     a comment
     extended on 3 lines
  */
Observe la desaparición de la línea `` still empty */'' debido a la existencia de dos comentarios, uno de ellos inacabado en la línea anterior.

Casiano Rodríguez León
2013-04-23