$ 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 /\/\*/,/\*\//pEste 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