Entendiendo el comando sed III

En los capítulos anteriores les presentaba el comando sed y les explicaba algunos ejemplos para comprender sobre que líneas tienen efecto los comandos aplicados. Hoy les comentaré las funciones que permite sed.

Entre las funciones más utilizadas por sed se encuentran las que permiten borrar líneas (d de delete), las de sustitución (s de substitute), imprimir líneas (p de print) o las que permiten leer líneas (r de read).

El siguiente ejemplo imprimirá por pantalla el rango de líneas que comprende desde la primera a la quinta:

 sed -e 1,5p fichero_datos

El siguiente ejemplo borrará el rango de líneas comprendido entre la tercera y la quinta y desde la décima en adelante:

 sed -e '3,5d' -e '10,$d' fichero_datos

En el anterior capítulo os comentaba el uso del carácter exclamación. Si no queremos escaparlo con el carácter ( \ ) podremos delimitar los comandos aplicados por sed por comillas simples ( ' ):

 sed -e '/^$/!d' dias
sed -e /^$/\!d dias

Hasta ahora hemos visto, los borrados y las impresiones. Una de las funciones más típicas que nos permite sed, es la que consiste en sustitución de patrones.

 sed 's/suspenso/aprobado/'

El anterior comando sustituye la primera aparición de "suspenso" por la cadena "aprobado" en cada línea donde se encuentre "suspenso". Si queremos que se cambien todas las apariciones de "suspenso" en todas las líneas, tendremos que usar el flag ( g ).

 sed 's/suspenso/aprobado/g'

El siguiente ejemplo, remplazará el carácter "é" por la cadena "é", excepto en las líneas que van desde la 1 a la 3:

 sed -e '1,3!s/e/´/' fichero_datos

Si quisieramos que la sustitución solo se hiciera entre las líneas 1 y 3, deberíamos quitar la exclamación ( ! ).

Por último un ejemplo bastante interesante. Si quisieramos añadir el contenido de un fichero, cada vez que encontrasemos una combinación de caracteres, podríamos utilizar el siguiente comando:

 sed '/cadena/r fichero_carga' fichero_datos




stumbleupondeliciousredditTechnoratiFacebookTwitter

Entendiendo el comando sed II

En el articulo anterior les hice una primera presentación del comando sed. Hoy voy a seguir contandoles cosas acerca de este magnífico editor de textos (Stream Editor).

En principio las funciones aplicadas por sed se aplican a todas las líneas de un fichero. Es posible delimitar dichas acciones a una sola línea, a un rango de líneas, a la última línea, o a las líneas identificadas por una expresión regular:

Si se pone un número o el carácter $ , la función se aplica sobre la línea indicada. El carácter $ representa la última línea del fichero:

  sed -e \$d fichero_prueba #Borra la última línea
sed -e 1d fichero_prueba #Borra la primera línea

Si se ponen dos números, la función se aplicará a las líneas cuyo número esté en el rango establecido:

  sed -e 3-6d  fichero_prueba #Borra desde la línea 3 a la 6 incusive

Si se pone una expresión regular, la función se aplicará sobre las líneas que encajen con la expresión regular (Las expresiones regulares en sed, se fijan entre barras del 7 /

 sed -e /^$/d fichero_datos #Borra líneas vacias

Si se ponen 2 expresiones regulares, éstas definirán parráfos. El primer parráfo comenzará cuando se encuentre la primera expresión regular, y abarcará hasta que se encuentre la segunda expresión regular. Acabado el primer parráfo, el segundo comenzará con la primera línea en que se encuentre la primera expresión regular, y así sucesivamente:

 cat fichero_datos
lunes
martes
miercoles
jueves
viernes
sabado
domingo
sed /n/,/vier/d fichero_datos

El ejemplo anterior tomará como primer párrafo, las líneas de lunes a viernes y como segundo la línea domingo.

Un carácter de exclamación ( ! ), después de establecer el rango de líneas en el que queremos que se aplique la función indicada a sed, hará que ésta se aplique justamente al rango de líneas complementario al que tomaría sin ese carácter:

 sed /^$/\!d fichero_datos  #Borraría todas las líneas NO vacias

Ojo, para sed, el carácter $ significa última línea, pero para las expresiones regulares, el carácter $ significa final de línea.


Deckerix



stumbleupondeliciousredditTechnoratiFacebookTwitter

Entendiendo el comando sed

sed es un editor no interactivo. Es útil si se va a realizar varias veces modificaciones sobre uno o varios ficheros.

Cuando digo que sed es un editor no interactivo me refiero a que los cambios no se realizan sobre el fichero en sí, si no que los cambios aparecen en la salida estandar. Para entender mejor esto, imaginamos que con nuestro editor de textos favorito borramos la línea 3 de un fichero y posteriormente borramos la línea 15 actual. Habremos borrado las líneas 3 y 16 del fichero origen. Esto se podría haber evitado habiendo borrado primero la 16 y luego la 3.

Con sed, la numeración de las líneas no cambia al borrar una, ya que estas se numeran inicialmente. Podríamos haber resuelto el problema anterior de la siguiente manera:

 sed -e '3d' -e '15d' fichero_datos

sed aplica todos los comandos de edición a cada línea de texto de un fichero. Empieza aplicando todos los comandos a la primera línea, luego todos a la segunda, y así sucesivamente.

 sed -f fichero
Toma los comandos de edición del fichero que sigue al flag -f
 sed -e comando
Ejecuta el comando
 sed -e comando -e comando
Ejecuta los comandos indicados
 sed -f ficheroDeComandos ficheroDatos1 ficherosDatos2
Ejecuta los comandos que se encuentran guardados en el fichero
ficheroDeComandos sobre los ficheros
ficheroDatos1, ficheroDatos2, etc...

Si no se nombran los ficheros, sed filtra la entrada estándar. Si se nombran los ficheros, sed manda a la salida estándar el resultado de aplicar los comandos sobre las líneas de dichos ficheros.


deckerix


stumbleupondeliciousredditTechnoratiFacebookTwitter