Saltar la navegación

Opciones de la línea de comando

La sintaxis del comando sed es la siguiente:

$ sed [opciones] [script] [ficheros]

El script está constituido por los comandos de sed que queremos que se apliquen en cada ciclo. Los ficheros, todos juntos, como una unidad, constituyen el flujo de entrada de texto que procesará sed.

El comando s es el más utilizado con sed, sirve para buscar una expresión regular, y en caso de encontrar un texto que concuerde con ella, lo sustituirá por un texto que previamente habremos especificado. Este comando lo veremos con detalle más adelante, pero ahora, para simplificar, esta será su sintaxis:

s/expresión regular a buscar/texto a sustituir/

De esta forma, se busca y se sustituye dentro de la línea solo la primera coincidencia de la expresión regular, si queremos que se sustituyan todas las coincidencias que haya, la sintaxis sería así:

s/expresión regular a buscar/texto a sustituir/g

Probemos ahora el comando sed con los ficheros f y g que usaré a lo largo de todo el tutorial.

$ cat f
uno
dos
tres
$ cat g
cuatro
$ sed 's/^/-/' f g
-uno
-dos
-tres
-cuatro

Podemos ver que en la ejecución de sed no se han usado opciones, el script está formado por un solo comando, el comando 's/^/-/', que busca la cadena nula que se encuentra en el inicio de una línea (expresiones regulares) y la sustituye por un guión. Los ficheros f y g se unen y forman el flujo de entrada sobre el que se aplica el ciclo de sed. El resultado lo obtenemos por la salida estándar, y está formado por todas las líneas del flujo de entrada, hayan sido modificadas o no, el último paso del ciclo siempre es visualizar el área de trabajo. En este caso, todas las líneas contienen la expresión regular de búsqueda y por lo tanto todas han sido modificadas.

Opción -n, --quiet, --silent

La opción -n de sed actúa sobre el último paso del ciclo, evitando que la zona de trabajo se envíe a la salida estándar, como podemos ver a continuación:

$ sed -n 's/^/-/' f g
$

Se suele decir que si usamos la opción -n el autoprint se desactiva.

Existe el comando p, que envía a la salida estándar la zona de trabajo tal como se encuentre en el momento de su ejecución. Podemos utilizarlo y construir un script de dos comandos que trabaje igual que la primera ejecución que hemos hecho de sed:

$ sed -n 's/^/-/ ; p' f g
-uno
-dos
-tres
-cuatro

Vemos que los comandos dentro del script de la línea de comando se separan por un punto y coma.

El flujo de entrada de sed es la entrada estándar si no especificamos ficheros:

$ seq 3 | sed 's/^/-/'
-1
-2
-3

E incluso, con el parámetro -, como sucede con muchos otros comandos de Unix, podemos referirnos a la entrada estándar y usarla junto con ficheros regulares:

$ seq 3 | sed 's/^/-/' f - g
-uno
-dos
-tres
-1
-2
-3
-cuatro

Opción -i[sufijo], --in-place[=sufijo]

Con la opción -i, sed trabaja individualmente con cada fichero y la salida se guarda en el propio fichero, perdiéndose la información original:

$ sed -i 's/^/-/' f g
$ cat f
-uno
-dos
-tres
$ cat g
-cuatro

Si no queremos perder la información original, especificaríamos un sufijo y entonces el fichero original se copiará en otro fichero con el mismo nombre más el sufijo:

$ sed -i.original 's/^/-/' f g
$ ls
f f.original g g.original
$ cat f
-uno
-dos
-tres
$ cat f.original
uno
dos
tres

El sufijo puede llevar un asterisco (*) o varios, y este se sustituye por el nombre del fichero original, lo podríamos utilizar, por ejemplo, para añadir un prefijo en vez de un sufijo, o para poner un directorio donde queremos que se copien los originales:

$ sed -ioriginal.* 's/^/-/' f g
$ ls
f g original.f original.g
$ cat g
-cuatro
$ cat original.g
cuatro
$ sed -ioriginales/* 's/^/-/' f g
$ ls
f g
$ ls originales
f g
$ cat g
-cuatro
$ cat originales/g
cuatro

Opción -e script, --expression=script

La opción -e sirve para especificar el script de comandos sed que queremos que se apliquen. Si se especifican varias opciones -e, todos los script se unen de izquierda a derecha para construir el script a aplicar.

Los siguientes comandos son todos equivalentes:

$ sed -n 's/^/-/ ; p' f g
$ sed -n -e 's/^/-/ ; p' f g
$ sed -n -e 's/^/-/' -e 'p' f g

Opción -f fichero-script, --file=fichero-script

La opción -f funciona como la opción -e anterior, solo que los comandos del script deben estar dentro del fichero especificado. También pueden usarse más de una opción -f.

$ echo 's/^/-/ ; p' > script.sed
$ sed -n -f script.sed f g
-uno
-dos
-tres
-cuatro

Dentro de un fichero script de sed, los comandos pueden ir cada uno en una línea, y no sería necesario usar el separador punto y coma:

$ echo -e 's/^/-/\np' > script.sed
$ cat script.sed
s/^/-/
p
$ sed -n -f script.sed f g
-uno
-dos
-tres
-cuatro

Es posible, en estos ficheros, poner comentarios con el comando #.

Las opciones -e y -f podrían llegar a mezclarse, y el script resultante se contruiría concatenando los scripts de dichas opciones tomándolas de izquierda a derecha:

$ echo 'p' > script.sed
$ sed -n -e 's/^/-/' -f script.sed f g
-uno
-dos
-tres
-cuatro

Opción -E, -r, --regexp-extended

La opción -E la utilizaremos para indicarle a sed que las expresiones regulares que estamos utilizando son extendidas (ERE). Por defecto, sed espera que sean básicas (BRE).

Usando sed con BRE:

$ sed 's/e\|a/-/' f g
uno
dos
tr-s
cu-tro

Y usando ERE:

$ sed -E 's/e|a/-/' f g
uno
dos
tr-s
cu-tro

Opción --posix

Si usamos esta opción solo podemos emplear los comandos estándar POSIX de sed, si usáramos un comando que fuese extensión de GNU nos daría un mensaje de error. Útil para cuando queramos crear scripts compatibles con todas las versiones de sed, pero lo habitual es usar GNU sed con sus extensiones.

$ sed 'Q' f g
$ sed --posix 'Q' f g
sed: -e expresión #1, carácter 1: orden desconocida: `Q'

Opción --version

La usaremos para consultar la versión de sed que estamos utilizando.

$ sed --version
sed (GNU sed) 4.9
...

Opción -z, --null-data

Existen ficheros de texto cuyas líneas no acaban ni en \n (Unix) ni en \r\n (Windows), sino en \0 (ASCII - 0). Si queremos que sed trabaje con ficheros de este tipo debemos hacérselo saber con la opción -z. Muchos comandos de Unix trabajan con estos tipos de ficheros, tanto para leerlos como para escribirlos, y siempre hay que usar alguna opción para indicarlo, por defecto, se asume que los ficheros están constituidos por líneas que acaban en \n.

Opción --follow-symlinks

Esta opción solo es útil para sistemas UNIX que es donde existen los enlaces simbólicos, y tiene sentido si usamos además la opción -i, que como vimos, hace que sed guarde la salida en cada uno de los ficheros especificados, si uno de estos ficheros es un enlace simbólico, por defecto, sed rompe el enlace, crea un fichero con el nombre del enlace y dentro de él escribe la salida. Si usamos la opción --follow-symlinks, entonces la salida se guardará en el fichero al que apunta el enlace simbólico y este se mantiene, no se rompe.

Existen otras opciones además de las descritas, pero se documentarán en el contexto del comando donde tienen sentido.