Rangos

Cuando se usan dos direcciones separadas por una coma, el rango que representan se extiende desde la primera línea que casa con el patrón hasta la siguiente línea que casa con el segundo patrón. El siguiente script muestra las tablas que aparecen en un fichero LATEX:
$ cat tables.sed
#Imprime las tablas en un fichero tex
/\\begin{tabular}/,/end{tabular}/p
$ sed -n -f tables.sed *.tex
\begin{tabular}{c|c}
        [address]a$\backslash$ & [address]i$\backslash$\\
        text                   & text\\
\end{tabular}\\
\begin{tabular}{c|c}
        [address]a$\backslash$ & [address]i$\backslash$\\
        text                   & text\\
\end{tabular}\\

La siguiente selección para un rango comienza después de la última línea del rango previo; esto es, si el rango es /A/,/B/, el primer conjunto de líneas que casa va desde la primera aparicion de /A/ hasta la siguiente aparición de /B/. Asi, el número mínimo de líneas seleccionadas (si no es cero) es dos. Sólo en el caso en que la primera dirección es una expresión regular y la segunda un número de línea que viene antes de la línea que casa, es que sólo se selecciona una línea de emparejamiento. No hay por tanto solapes entre dos casamientos en un misma rango de direcciones. El siguiente ejemplo ilustra la forma en la que sed interpreta los rangos de direcciones. Es una aproximación al problema de escribir los comentarios de un programa C.

$ cat scope.sed
#execute: sed -n -f scope.sed scope.test
/\/\*/,/\*\//p
Este script puede funcionar con programas cuyos comentarios (no anidados) empiecen y terminen en líneas diferentes, como el del ejemplo:
$ cat scope2.test
#file scope2.test
#include <stdio.h>
 
fact(int n) { /* recursive function
if(n == 0) return 1;
else(return n*fact(n-1));*/
}
 
void toto(id) {
}
 
main() {
  toto();
  printf("Hello world! factorial of 4 = %d\n",fact(4)); /* the
         comment takes two lines */
}
La ejecución del script selecciona los dos grupos de líneas que contienen comentarios:
$ sed -n -f scope.sed scope2.test
fact(int n) { /* recursive function
if(n == 0) return 1;
else(return n*fact(n-1));*/
  printf("Hello world! factorial of 4 = %d\n",fact(4)); /* the
         comment takes two lines */
Sin embargo, el script fallará en este otro ejemplo:
$ cat scope.test
#include <stdio.h>
 
fact(int n) { /* recursive function */
if(n == 0) return 1;
else(return n*fact(n-1));
}
 
void toto(id) {
}
 
main() {
  toto();
  printf("Hello world! factorial of 4 = %d\n",fact(4)); /* the
         comment takes two lines */
}
La ejecución del programa da como resultado:
$ sed -n -f scope.sed scope.test
fact(int n) { /* recursive function */
if(n == 0) return 1;
else(return n*fact(n-1));
}
 
void toto(id) {
}
 
main() {
  toto();
  printf("Hello world! factorial of 4 = %d\n",fact(4)); /* the
         comment takes two lines */

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