Entendiendo el comando sed II
En el articulo anterior os hice una primera presentación del comando sed. Hoy voy a seguir contandoos 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.