martes, 8 de octubre de 2013

Sed Tutorial

SED 

opera líea por línea por lo que no hay restricciones en cuanto al tamaño de los archivos.

no importa si el archivo tiene muchas líneas, solamente se ocupará en un momento el espacio en memoria, tiene ventajas.

Es un editor no interactivo, ya que funciona direfente.

Sed permite editar un archivo en modo linea de comandos sin interactuar con el archivo, le daremos comandos y al final nos regresará los resultados del archivo.

no modifica al archivo si no modifica a lo que se encuentra en memoria y lo mandará a la salida estándar.


La entrada estándar, puede ser un archivo, puede ser una línea, donde se tendrán n líneas.

habrá una entrada de memoria que tendrá una entrada de patrones.

habrá una entrada de memoria que se llamará espacio de retención, que será un tipo de buffer de almcenamiento.

se podrá tomar cualquier linea de la entrada estándar y se copiará al espacio de patrones, y después se editará la línea y se enviará a la entrada estándar, puede ser un archivo o la pantalla.

Si se tendrá que lmacenar el resultado para después aplicarlo se usará el espacio de retención, y después se podrá enviar al espacio de patrones.

Sed por omisión imprime todas las líneas.

independientemente si se les aplico o no un cambio.

sed -n -> que indica no impresión, indicando lo que imprimirá solamente.

sed -e -> permite dar varios comandos a ejecutar.

sed -f .> podemos darle un archivo con comandos .

VI -> es un editor orientado a pantalla, no es un editor orientado a línea.

ed y vi son los dos editores principales en UNIX.

ed es un editor orientado a línea.

exíste una version mejorada llamada -> ex

el editor vi, tiene un modo de operación que se conoce -ex

y todos los comandos que se pueden ejecutar en vi, son comandos basados en ed, que es un editor orientado a línea.

sed es un editor de flujo, pero muchos de sus comandos funcionan muy parecido a los editores orientados a línea de UNIX.

Ej:

en vi, se pueden hacer sustituciones de una palabra por otra palabra, esas sustituciones son del editor ex, y esas sustituciones las toma sed, para trabajar.


Instrucciones de sed

sintáxis -> [dirección1 [, dirección2]] función [argumentos]

si se aplica a dirección1, la función aplica a todas las líenas que cumplan la condición.

ej:

vi frutas

si queremos borra de la linea 1,3d

el 1 es la dirección 1 , dirección2, función

 Hay funciones que no necesitan argumentos, hay funciones que si necesitan argumentos.

Si no se especifican direcciones, en caso de sed, que trabaja línea por línea, la función aplica a todas las líneas de entrada.

en el caso de vi, solamente aplica a la línea donde se encuentra el prompt

es más poderoso que vi, aunque vi, permite expresiones regulares.

¿Qué puede ser una dirección?

puede ser un número decimal, que indica la posición exacta de la línea.
$  -> implica la última línea del archivo

Ej:
:.,$d    -> que implica desde donde te encuentras actualmente borra, hasta el final.

/regexp/  -> asi se escriben las expresiones regulares en sed.

Ej:

sed -n '/^man/,/^na/p'

manzana
uva
naranja
sandia
fresa
kiwi
guayaba
hola

/^man/ -> es la directiva1,  la directiva2 es /^na/ , después la función, siendo que la función común es imprimir.

la cual imprimira hasta naranja.

siendo el archivo original:


manzana
uva
naranja
sandía
fresa
kiwi
guayaba
hola

Ej2: sed -n '4,$p' frutas

imprimira desde la línea 4 hasta el final

Consideraciones

si antes de la letra de la función se pone un signo de admiración !, se aplica a todas las 
líneas que no cumplan con las direcciones en (csh\!)


exísten delimitadoras  con @/usr/local/bin/perl@ para claridad en los comandos.

Ej:

sed -n '/col/=' frutas


sed -n '/^man/='  -> que nos imprimirá en que linea se encuentra la palabra que comienza en man


funciones para edición
en Unix sólo aceptan dirección1

a\ -> agregar
i\ -> insertar
c\ -> cambiar


le podemos poner al archivo las palabras en donde queramos y lo que querramos agregar mediante los comandos anteriores con sed.


Ej:

sed '/^man/a\ <- enter="" p="">> mango' frutas (osea al archivo)

y agrregará a la palabra que comienza con man, mango

insertar es antes y añadir es después.

cambiar -> sustituye toda la línea.

el siguiente comando es borrar

sed '1d' frutas

que borra la primera línea

sed '1,3d' frutas
borra desde la línea 1 hasta la 3


sed '$d' frutas  -> borra la última línea, del archivo

s [sustituir] [dirección1[,dirección2]]s/patrón/reemplazo/banderas


sed 's/ipn/IPN/g' datos

traducirá el primero por el segundo para todo el archivo, si se le quita

sed 's/ipn/IPN/' datos -> solamente lo hará para la primera ocurrencia.

para poder reemplazar es con:

sed 's@/usr/local/bin/hello@/etc/hola@' archivo

con lo anterior cambiamos por linea de comandos sin modificar al archivo y lo traducimos.


Se puede utilizar la diagonal invertida

sed 's/:/\
>/2' columnas

el archivo original fue:
1:2:3:4
el archivo después de hacer lo anterior es:
1:2
3:4
con lo anterior coloca como columnas a partir del segundo campo


Nota: para AWK, habrán ejemplos en el moodle.

crearemos un archivo de texto, y con la siguiente búsqueda

sed 's/Seccion [1-9]\.[1-9]/(&)/' texto.txt

donde encuentra sección1.1  & vale seccion1.1, siendo el valor poniendolo en amperstand,







Ejemplo 2:

vamos a delimitar, abriendo un paréntesis para la primera delimitación

/(.*\):\(.*\)/\2:\1/

primero:segundo

siendo la primer ocurrencia -> primero, y la segunda ocurrencia -> segundo

lo que hará será sustituir  inversamente lo que tenga el archivo
\2:\1/

por lo que se necesita delimitar muy bien el archivo, lo que se quiere es simplificar de una manera sencila el intercambio del contenido de los archivo, también funciona para vi.

Etiquetas

:etiqueta -> pone un marcador en el script de sed

t[etiqueta] -> Si el resultado de una sustictución es exitoso, salta a la línea marcada con etiqueta o en su defecto al final del script.

T[etiqueta]

Ej:

calificación.txt


podemos crear archivos con extensión.sed :

ejemplo.sed





que lo que hará

lo primero que hace es tomar la primera línea de entrada:

Nombre=

a partir de [dir1,[dir2]]funcion, pero lo que tenemos aquí son funciones agrupadas.
en vez de tener una sola funcion, tendremos un conjunto de instrucciones agrupadas para la directiva Nombre.

Coincide la primera línea con la directiva Nombre?, si entonces se sustituye el patron por si mismo.

el amperstand se simplifica con la coincidencia, no haciendo ningún cambio.

despues .. fue la sustitución exitosa?, entonces fue exitosa...despues viene t, que implica ir a la etiqueta.

temrminando el archivo, pero el archivo de entrada no ha terminado, tomando la siguiente linea del archivo de entrada.

entrando con Nombre, despues se verifica, si corresponde con el primer patrón, despues viene t, para verificar, pero como no lo fue se va a s/Nombre=.* Ex=.^/& Tarea=00, que sería la segunda línea.

t pregunta de nuevo si fue exitoso, si si lo fue se va hasta el final del archivo.

& -> implica que coicida con si mismo la ocurrencia.

awk y sed funcionna muy parecido.

resumiendo, para cada línea evaluamos un lenguaje, siguiendo un flujo de arriba hacia abajo, pero si controlamos las etiquetas, podemos controlar el flujo del programa, siendo un if escondido.

Para ejecutarlo:

sed -f ejemplo.sed calificacion.txt

mandandole el archivo.sed el archivo que procesaremos.

con el segundo ejemplo, en vez de irse al final del archivo con t, se va a la etiqueta hola



tr "\t" "#" < lista | sed 's/\(.*\)#\(.*\)/\2\(\1\)/'
tr - > cambia o elimina
lo que hace es voltear el archivo, añadimos los paréntesis.

o más bien voltear los campos y colocar entre paréntesis los nombres

ctrl M, indica que hay un caracter que esta haciendo ruido,

vi
lo podemos abrir :$s/^v^M//g
capturando el ctrl M  y sustituirlo por nada, para todas las líneas



Uso del espacio de retención

Ejemplo3:

el gato es bonito
el perro es bello


copia el contenido del espacio de patrones al espacio de retención
h reemplaza coel gato es bonito

coincide la primera linea con la expre regular e la primera, ??
si coincide .. comenzando con h
h dice -> copiaras todo lo que esta en el espacio de patrones al espacio de retencion, teniendo lo mismo en el espacio de patrones con el espacio de retencion.

con s/ .* ... -> se sustituye, cualquier cosa, seguido de espacio, seguido de una subcadena es espacio loque sea


con la tercera linea...
en el espacio de patrones verfifica cualquier cosa hasta El, siendo la subcadena 2, seguido de lo que sea, es... bonito, es la subcadena 3 y se sustituirá por \2 GATO \3



quedando:
EL GATO es bonito

Nota: todo lo que se hace se opera en el espacio de patrones, solamente cuando agregamos o añadimos se utiliza el espacio de retención.

Hay ejemplos, que utiliza códigos en html, que quitaremos los tags o etiquetas, obteniendo la información que se muestra por el browsers.

y todo se ocupa con el espacio de patrones y el espacio de retención

No hay comentarios:

Publicar un comentario

Entradas populares