Saltar la navegación

Comando e (execute)

El comando e (execute) es una extensión de GNU que permite ejecutar un comando del shell y su salida enviarla a la salida estándar o a la zona de trabajo. Su sintaxis es la siguiente:

e [comando-del-shell]

Si no se especifica ningún comando del shell como argumento, el contenido de la zona de trabajo se interpreta como un comando del shell, este se ejecuta y su salida previa eliminación del último \n reemplaza el contenido de la zona de trabajo .

En el caso de que se especifique un comando del shell, este se ejecutará y su salida se enviará a la salida estándar en ese momento del ciclo.

Cualquier cosa que pongamos a la derecha del comando e se interpretará como un comando del shell, por lo que para escribir otro comando sed a la derecha se debe hacer con otra opción -e o bien en otra línea del script.

Veamos el siguiente ejemplo donde "ficheros" contiene una lista de ficheros y vamos a mostrar el tamaño en bytes y el nombre de cada uno de ellos:

$ cat ficheros
f
g
$ cat script.sed
s/(.*)/ls -l --quoting-style=c "\1"/
e
s/(.+) +(.+) +(.+) +(.+) +(.+) +(.+) +(.+) +(.+) +"(.+)"/\5 \9/
$ sed -E -f script.sed ficheros
13 f
7 g

Lo que hacemos es lo siguiente:

  1. Usamos -E porque hemos utilizado ERE, y -f porque el script lo tenemos en un fichero.
  2. El primer comando del ciclo construye en la zona de trabajo el comando a ejecutar, obligando a que el nombre aparezca entrecomillado.
  3. El segundo comando interpreta el contenido de la zona de trabajo como un comando del shell, lo ejecuta y su salida reemplaza la zona de trabajo.
  4. El tercer comando divide el contenido de la zona de trabajo en distintos campos de información usando subexpresiones, y usando retroreferencias solo nos quedamos con los dos datos que nos interesan, el tamaño en bytes y el nombre del fichero.

La expresión regular del segundo comando s podríamos reducirla y quedaría así:

s/(.+ +){4}(.+) +(.+ +){3}"(.+)"/\2 \4/