Beruflich Dokumente
Kultur Dokumente
Uso básico
$ cat rata
1
2
3
4
5
6
$ sed '2d' rata
1
3
4
5
6
Modificar líneas
$ cat prueba1.sed
2p
$ sed -n -f prueba1.sed rata
2
Rangos
Tienen la forma:
direccion1,direccion2
Ejemplo:
$ cat rata
1
2
3
4
5
6
$ sed -n '/[23]/,/[56]/p' rata
2
3
4
5
$ cat prueba2.sed
# Un ejemplo sed
/[23]/,/[56]/p
$ sed -n -f prueba2.sed rata
2
3
4
5
Terminar: q
$ cat prueba3.sed
# Un ejemplo sed
/[23]/,/[56]/p
4q 10
$ sed -n -f prueba3.sed rata
2
3
4
$ echo $?
10
$ cat prueba4.sed
# Un ejemplo sed
/[23]/,/[56]/d
diego@rat:~/escritos/sed$ sed -f prueba4.sed rata
1
6
Agrupar comandos: { … }
Ejemplo:
$ cat prueba6.sed
# Un ejemplo sed
/[23]/,/[56]/s/.*/x/p
1s/.*/a&b/p
$ sed -n -f prueba6.sed rata
a1b
x
x
x
x
Ejemplo:
$ cat raton
estaba la rana cantando
debajo del agua
diego@rat:~/escritos/sed$ cat prueba7.sed
# Un ejemplo sed
1s/a/x/g
2s/a/x/
diego@rat:~/escritos/sed$ sed -f prueba7.sed raton
estxbx lx rxnx cxntxndo
debxjo del agua
Grabar en archivo: w
$ cat salida.txt
xxx
$ cat prueba8.sed
# Un ejemplo sed
/[23]/,/[56]/{p
w salida.txt
}
$ sed -n -f prueba8.sed rata
2
3
4
5
$ cat salida.txt
2
3
4
5
El "espacio hold"
Estos comandos son algo extraños. Ver los ejemplos más adelante.
x: Intercambiar el contenido del "espacio hold" con el del "espacio
de patrones"
g: Transferir el contenido del "espacio hold" hacia el del "espacio
de patrones"
h: Transferir el contenido del "espacio de patrones" hacia el del
"espacio hold"
G: Agregar un "fin de línea" al contenido del "espacio de patrones"
y a continuación agregarle el contenido del "espacio hold"
H: Agregar un "fin de línea" al contenido del "espacio hold" y a
continuación agregarle el contenido del "espacio de patrones"
Otros comandos
P: Imprimir el contenido del "espacio de patrones" hasta antes del
primer "fin de línea"
N: Agregar un "fin de línea" al "espacio de patrones" y a
continuación agregar el contenido de la siguiente línea de la
entrada
D: Borrar caracteres en el "espacio de patrones" hasta el primer
"fin de línea". Si no queda ningún contenido, reiniciar un ciclo
normal; de lo contrario, el ciclo se reinicia con el contenido actual
:etiq Permite especificar una "etiqueta" a continuación del ":"
b etiq : Genera un salto en la ejecución del script hacia la etiqueta
especificada
t etiq : Genera un salto sólo si ha ocurrido una substitución exitosa
en la última línea leída
y/s1/s2/ : Traduce los caracteres listados en s1 a los listados
en s2. Estos conjuntos de caracteres deben ser del mismo
tamaño
4. Ejemplos de Sed
4.1. Substituciones simples: Cambiar Ajos por Frijoles
$ cat ajos.txt
El trabajo dignifica al hombre
Las semillas del ajo tienen un fuerte olor a ajo
Ajolote es un animal extraño
Ajo para ahuyentar al vampiro!
Obrajosa, el pueblo de Doña Perfecta
Le rebajo el kilo de ajos
$ cat ajos1.sed
$ sed -f ajos1.sed ajos.txt
El trabfrijol dignifica al hombre
Las semillas del frijol tienen un fuerte olor a frijol
Ajolote es un animal extraño
Ajo para ahuyentar al vampiro!
Obrfrijolsa, el pueblo de Doña Perfecta
Le rebfrijol el kilo de frijols
$ cat ajos2.sed
s/ ajo / frijol /g
$ sed -f ajos2.sed ajos.txt
El trabajo dignifica al hombre
Las semillas del frijol tienen un fuerte olor a ajo
Ajolote es un animal extraño
Ajo para ahuyentar al vampiro!
Obrajosa, el pueblo de Doña Perfecta
Le rebajo el kilo de ajos
$ cat ajos3.sed
s/ ajo / frijol /g
s/ ajo$/ frijol/
s/^ajo /frijol /
$ sed -f ajos3.sed ajos.txt
El trabajo dignifica al hombre
Las semillas del frijol tienen un fuerte olor a frijol
Ajolote es un animal extraño
Ajo para ahuyentar al vampiro!
Obrajosa, el pueblo de Doña Perfecta
Le rebajo el kilo de ajos
$ cat ajos4.sed
s/ ajo / frijol /g
s/ ajo$/ frijol/
s/^ajo /frijol /
s/ Ajo / Frijol /g
s/ Ajo$/ Frijol/
s/^Ajo /Frijol /
$ sed -f ajos4.sed ajos.txt
El trabajo dignifica al hombre
Las semillas del frijol tienen un fuerte olor a frijol
Ajolote es un animal extraño
Frijol para ahuyentar al vampiro!
Obrajosa, el pueblo de Doña Perfecta
Le rebajo el kilo de ajos
$ cat ajos5.sed
s/ ajo / frijol /g
s/ ajo$/ frijol/
s/^ajo /frijol /
s/ Ajo / Frijol /g
s/ Ajo$/ Frijol/
s/^Ajo /Frijol /
s/ ajos / frijoles /g
s/ ajos$/ frijoles/
s/^ajos /frijoles /
s/ Ajos / Frijoles /g
s/ Ajos$/ Frijoles/
s/^Ajos /Frijoles /
$ sed -f ajos5.sed ajos.txt
El trabajo dignifica al hombre
Las semillas del frijol tienen un fuerte olor a frijol
Ajolote es un animal extraño
Frijol para ahuyentar al vampiro!
Obrajosa, el pueblo de Doña Perfecta
Le rebajo el kilo de frijoles
$ sed -f rever.sed
123456
654321
abracadabra
arbadacarba
$ cat rever.sed
s/^.*$/&\n/
:n
s/^\([^\n]\)\(.*\)\n\(.*\)$/\2\n\1\3/
tn
s/\n//
Tras salir del loop, una última substitución elimina el salto de línea
agregado.
cat libros.txt
Archivo de Libros
--------------
La abeja Maya
--------------
$ cat libros.sed
/^-------/{
N
N
s/\(.*\)\n\(.*\)\n\(.*\)/\3/
p
}
$ sed -n -f libros.sed libros.txt
La abeja Maya
Los perros hambrientos
Cien años de soledad
La primera línea busca líneas con guiones; para cada una de éstas, se
procede a agregar (al buffer de patrones) el contenido de las dos
líneas que siguen (con un salto de línea intermedio) mediante el
comando N. Finalmente, la substitución separa el buffer de patrones en
tres expresiones regulares separadas por saltos de línea y lo
substituye por el tercero de éstos (la última línea leída, el título.)
Finalmente, el resultado se imprime con p (que a la sazón agrega un
conveniente salto de línea.)
Los comandos "H" y "g" se ejecutan para todas las líneas. En el primer
caso, el espacio "hold" va acumulando las líneas leídas (el espacio de
patrones) separadas por saltos de línea; a continuación, el comando
"g" transfiere esta acumulación al espacio de patrones. Para las
primeras tres lineas no se hace nada más.
cat subrayado.sed
# subrayar la primera linea
1{h
s/./-/g
H
g
}
Dos columnas
$ cat 2col.sed
# subrayar la primera linea
1{h
s/./-/g
H
g
}
2,${s/.*/&\t/
N
s/\n//
}
El resultado es:
$ cat 2colnotab.sed
# subrayar la primera linea
1{h
s/./-/g
H
g
}
2,${s/.*/& /
s/\(.\{20\}\).*/\1/
N
s/\n//
}
sed significa “stream editor” o editor de entrada de datos, sed comúnmente es utilizado como
un filtro. Lee cada linea de su entrada de datos y entonces realiza las acciones solicitadas. La
sintaxis básica de un comando sed es:
En donde archivos es uno o mas archivos y programa es uno o mas comandos de la forma:
Comenzaremos con la expresion mas simple, desplegar lineas que coincidan con una
expresion.
Para poder realizar unas simples pruebas crearemos un archivo simple, digamos una lista de
precios de frutas (para variar):
Al pulsar las teclas [Ctrl+d], forzamos a terminar la entrada de datos y posteriormente se graba
el contenido en el archivo “frutas” y acaba mostrando el símbolo de comandos.
Digamos que deseamos desplegar una lista de las frutas que cuestan menos de 1 euro. Para
eso necesitaríamos utilizar el comando p de sed (p=print).
Ejecutamos el comando:
Vemos que las lineas que coinciden con nuestra expresion aparecen repetidas en el listado,
este es el comportamiento normal del comando sed, despliega cada linea de su entrada
estándar en la salida estándar. Para evitar este comportamiento podemos especificar el
parámetro -n de la siguiente manera:
Suponiendo que nos quedemos sin Manzanas y necesitamos borrarlos de la lista, para esto
usaremos el comando d (delete) de sed, la sintaxis seria la siguiente:
… se puede dar el caso también que esté en mayúscula, entonces añadimos al principio de la
linea, lo siguiente:
Observamos que nos muestra el contenido del archivo frutas menos el producto “Manzana“;
pero eso no quiere decir que se haya borrado del archivo frutas:
Esta vez no tuvimos que especificar el parámetro -n, debido a que la opcion p (print) imprime
toda su entrada de datos a la salida estándar, pero el comando d, simplemente elimina de la
salida estándar los datos que coincidan con la expresion.
Ejemplo
Podemos mostrar las líneas que nos interese, en el siguiente ejemplo, a partir de la línea 3,
mostrará las dos siguientes:
Vemos en la imagen de arriba que muestra los resultados obtenidos repitiendo las líneas; con
la opción -n especificamos a sed que no tiene que volver a mostrarlo todo:
Podemos sustituir una cadena de caracteres por otra en las líneas seleccionadas.