Mandato sed

Propósito

Un editor de secuencias.

Sintaxis

sed-n ] Script Archivo ... ]

sed-n ] [  -e Script ] ... [  -f ArchivoScript ] ... Archivo ... ]

Descripción

El mandato sed modifica algunas líneas del parámetro Archivo especificado en función de un script de edición y las graba en la salida estándar. El mandato sed incluye muchas características para seleccionar líneas que deben modificarse y realizar cambios sólo en las líneas seleccionadas.

El mandato sed utiliza dos espacios de trabajo para contener la línea que se está modificando: el espacio de patrón, donde está contenida la línea seleccionada, y el espacio de contención, donde una línea puede almacenarse temporalmente.

Un script de edición se compone de submandatos individuales, cada uno de ellos en una línea distinta. El formato general de los submandatos sed es el siguiente:

[rango-direcciones] función[modificadores]

El mandato sed procesa cada parámetro Archivo de entrada leyendo una línea de entrada en un espacio de patrón, aplicando todos los submandatos sed en secuencia cuyas direcciones seleccionen esta línea y grabando el espacio de patrón en la salida estándar. A continuación, borra el espacio de patrón y repite este proceso para cada línea especificada en el parámetro Archivo de entrada. Algunos de los submandatos sed utilizan un espacio de contención para guardar todo o parte del espacio de patrón para su recuperación posterior.

Cuando un mandato incluye una dirección (un número de línea o un patrón de búsqueda), sólo la línea o líneas direccionadas se ven afectadas por el mandato. En caso contrario, el mandato se aplica a todas las líneas.

Una dirección es un número de línea decimal, un $ (signo de dólar), que direcciona la última línea de entrada o una dirección de contexto. Una dirección de contexto es una expresión regular similar a las utilizadas en el mandato ed excepto por las siguientes diferencias:

Ciertos mandatos denominados direccionados le permiten especificar una línea o un rango d líneas a la que debe aplicarse el mandato. Las reglas siguientes se aplican a los mandatos direccionados:

Distintivos

-e Script Utiliza la variable Script como script de edición. Si utiliza sólo un distintivo -e y ningún distintivo -f, puede omitirse el distintivo -e.
-f ArchivoScript Utiliza la variable ArchivoScript como origen del script de edición. La variable ArchivoScript es un conjunto preparado de mandatos de edición aplicados al parámetro Archivo.
-n Suprime toda la información grabada normalmente en la salida estándar.
Nota:
Puede especificar varios distintivos -e y -f. Todos los submandatos se añaden al script en el orden especificado, independientemente de su origen.

Submandatos sed

El mandato sed contiene los siguientes submandatos de script sed. El número entre paréntesis que precede a un submandato indica el número máximo de direcciones permisibles para el submandato.

Notas:
  1. La variable Texto que acompaña a los submandatos a\, c\ y i\ puede continuar en más de una línea, siempre y cuando todas las líneas salvo la última terminan con una \ (barra inclinada invertida) para citar el carácter de línea nueva. Las barras inclinadas invertidas en el texto se tratan como barras inclinadas invertidas en la serie de sustitución de un mandato s y pueden utilizarse para proteger blancos iniciales y tabulaciones ante la eliminación de los mismos que se realiza en todas las líneas del script. Las variables RFile y WFile deben finalizar la línea de mandatos e ir precedidas exactamente por un blanco. Cada variable WFile se crea antes de que comience el proceso.
  2. El mandato sed puede procesar un máximo de 999 submandatos en un archivo de patrón.
Submandato Descripción
(1) a\  
Texto Coloca la variable Texto en la salida antes de leer la siguiente línea de entrada.
(2)b[etiqueta] Se bifurca al mandato : que contiene la variable etiqueta. Si la variable etiqueta está vacía, bifurca hasta el fin del script.
(2)c\  
Texto Suprime el espacio de patrón. Con 0 o 1 dirección o al final de un rango de 2 direcciones, coloca la variable Texto en la salida y, a continuación, inicia el ciclo siguiente.
(2)d Suprime el espacio de patrón y, a continuación, inicia el ciclo siguiente.
(2)D Suprime el segmento inicial del espacio de patrón hasta el primer carácter de línea nueva y, a continuación, inicia el ciclo siguiente.
(2)g Sustituye el contenido del espacio de patrón por el contenido del espacio de contención.
(2)G Añade el contenido del espacio de contención al espacio de patrón.
(2)h Sustituye el contenido del espacio de contención por el contenido del espacio de patrón.
(2)H Añade el contenido del espacio de patrón al espacio de contención.
(1)i\  
Texto Graba la variable Texto en la salida estándar antes de leer la línea siguiente en el espacio de patrón.
(2)l Graba el espacio de patrón en la salida estándar mostrando caracteres no visualizables como valores hexadecimales de 4 dígitos. Las líneas largas se reacomodan.
(2)l Graba el espacio de patrón en la salida estándar de forma no ambigua visualmente. Los caracteres \\\, \\a, \\b, \\f, \\r, \\t y \\v se graban como la secuencia de escape correspondiente. Los caracteres no imprimibles se graban como un número octal de tres dígitos (con un carácter de barra inclinada invertida inicial) para cada byte del carácter (el más importante es el primer byte). Este formato se utiliza también para los caracteres de varios bytes. Este submandato acomoda las líneas largas. Una barra inclinada invertida seguida de un carácter de línea nueva indica el punto de acomodación. La acomodación se produce en la posición de columna 72. Un $ (signo de dólar) marca el final de cada línea.
(2)n Graba el espacio de patrón en la salida estándar si no se suprime la salida estándar. Sustituye el espacio de patrón por la siguiente línea de entrada.
(2)N Agrega la línea siguiente de entrada al espacio de patrón con un carácter de línea nueva añadido (el número de línea actual cambia). Puede utilizarlo para buscar patrones que estén divididos en dos líneas.
(2)p Graba el espacio de patrón en la salida estándar.
(2)P Graba el segmento inicial del espacio de patrón hasta el primer carácter de línea nueva en la salida estándar.
(1)q Bifurca hasta el final del script. No inicia un ciclo nuevo.
(2)r RFile Lee el contenido de la variable RFile. Coloca el contenido en la salida antes de leer la siguiente línea de entrada.
(2)s/patrón/sustitución/distintivos Sustituye la serie sustitución por la primera aparición del parámetro patrón en el espacio de patrón. Cualquier carácter que se visualice después del submandato s se puede sustituir por el separador / (barra inclinada) excepto el espacio de carácter de nueva línea.

El valor de la variable distintivos debe ser cero o más de:

g
Sustituye todas las instancias que no se solapen del parámetro patrón en lugar de hacerlo sólo con la primera.
n
Sustituye la aparición enésima sólo del parámetro patrón.
p
Graba el espacio de patrón en la salida estándar si se ha realizado una sustitución.
w WFile
Graba el espacio de patrón en la variable WFile si se ha realizado una sustitución. Añade el espacio de patrón a la variable WFile. Si la variable WFile no se ha creado ya en una grabación anterior con este script sed, el mandato sed la creará.
(2)tetiqueta Bifurca a la variable :etiqueta del archivo de script si se han realizado sustituciones desde la lectura más reciente de una ejecución de línea de entrada de un submandato t. Si no especifica la variable etiqueta, el control se transferirá al final del script.
(2)wWFile Añade el espacio de patrón a la variable WFile.
(2)x Intercambia el contenido del espacio de patrón y el espacio de contención.
(2)y/patrón1/patrón2/ Sustituye todas las apariciones de caracteres en la variable patrón1 por los caracteres correspondientes de patrón2. El número de caracteres de las variables patrón1 y patrón2 debe ser igual. El carácter de nueva línea está representado por \n.
(2)!sed-cmd Aplica el submandato sed especificado sólo a las líneas no seleccionadas por la dirección o direcciones.
(0):etiqueta Marca un punto de ramificación que debe ser referenciado por los submandatos b y t. Esta etiqueta puede ser cualquier secuencia de ocho caracteres o menos.
(1)= Graba el número de línea actual en la salida estándar como una línea.
(2){subcmd } Agrupa los submandatos encerrados entre {} (llaves).
(0) Pasa por alto un mandato vacío.
(0)# Si un # (signo numérico) aparece como primer carácter en una línea de un archivo de script, toda la línea se trata como un comentario, con una sola excepción. Sólo en la primera línea de un archivo de script, si el carácter que sigue al signo # es una n, se suprimirá la salida por omisión. Se pasa por alto el resto de la línea después de #n.

Estado de salida

Este mandato devuelve los valores de salida siguientes:

0 Finalización satisfactoria.
>0 Se ha producido un error.

Ejemplos

  1. Para realizar un cambio global, entre:

    sed  "s/happy/enchanted/g" chap1

    Esta secuencia de mandatos sustituye cada aparición de la palabra happy que se encuentra en el archivo chap1 por la palabra enchanted. El carácter g al final del submandato s indica al mandato sed que haga tantas sustituciones como sea posible en cada línea. Sin el carácter g, el mandato sed sólo sustituirá la primera aparición de la palabra happy en una línea.

    El mandato sed funciona como un filtro. Lee texto de la entrada estándar o de los archivos indicados en la línea de mandatos (chap1 en este ejemplo), modifica este texto y lo graba en la salida estándar. A diferencia de la mayoría de editores, no sustituye al archivo original. Esto hace que el mandato sed sea potente cuando se utiliza en interconexiones.

  2. Para utilizar el mandato sed como filtro en una interconexión, entre:

    pr  chap2 | sed "s/Page *[0-9]*$/(&)/" | enq

    Esta secuencia de mandatos encierra los números de página entre paréntesis antes de imprimir el archivo chap2. El mandato pr coloca una cabecera y un número de página al principio de cada página y luego el mandato sed pone los números de página entre paréntesis y el mandato enq imprime la lista editada.

    El patrón de mandato sed /Page *[0-9]*$/ coincide con los números de página que aparecen al final de una línea. El submandato s cambia esto por (&), donde & sustituye al número de página coincidente.

  3. Para visualizar líneas seleccionadas de un archivo, entre:

    sed  -n  "/food/p" chap3

    sed -n muestra cada línea del archivo chap3 que contiene la palabra food. Normalmente, el mandato sed copia todas las líneas en la salida estándar después de editarla. El distintivo -n impide que el mandato sed haga esto. A continuación, utilice submandatos como p para escribir partes específicas del texto. Sin el distintivo -n, este ejemplo muestra todas las líneas del archivo chap3 y muestra cada línea que contiene food dos veces.

  4. Para realizar una edición compleja, entre:

    sed  -f  script.sed  chap4

    Esta secuencia de mandatos crea un archivo de script sed cuando se desea realizar algo complejo. A continuación, puede probar y modificar el script antes de utilizarlo. También puede volver a utilizar el script para editar otros archivos. Cree el archivo de script con un editor de texto interactivo.

  5. Un ejemplo de archivo de script sed:

    :join
    /\\$/{N
    s/\\\n//
    b join
    }

    Este script sed une cada línea que finaliza en una \ (barra inclinada invertida) en la línea que lo sigue. En primer lugar, el patrón  /\\$/ selecciona una línea que finaliza con una \ para el grupo de mandatos encerrados entre {} (llaves). A continuación, el submandato N añade la línea siguiente, incluyendo un carácter de nueva línea. Con s/\\\n// se suprime \ y el carácter de nueva línea incluido. Finalmente, b join bifurca de vuelta a la etiqueta :join para comprobar una al final de la línea recién unida. Sin la ramificación, el mandato sed graba la línea unida y lee la siguiente antes de comprobar si hay una segunda  \.

    Nota:
    El submandato N hace que el mandato sed se detenga inmediatamente si no hay más líneas de entrada (es decir, si el submandato N lee un carácter de fin de archivo). No copia el espacio de patrón en la salida estándar antes de detenerse. Esto quiere decir que, si la última línea de la entrada termina con una \, no se copia en la salida.
  6. Para copiar un archivo existente (oldfile) en un archivo nuevo (newfile) y sustituir todas las apariciones de la serie de texto testpattern con el contenido de la variable de shell $REPL, entre:

    cat oldfile | sed -e "s/testpattern/$REPL/g" | tee newfile
  7. Para sustituir todas las apariciones de A por a, B por b, C por c, y todas las apariciones de nuevas líneas con el carácter Z en el archivo de entrada, entre:
    $ sed -f command.file input.file
    donde command.file es el archivo de script e input.file es el archivo de entrada.
       $cat command.file
       y/ABC\n/abcZ/
    
    Como alternativa, también puede ejecutarse el mandato siguiente para realizar la misma función:
    sed "y/ABC\n/abcZ/" input.file

Información relacionada

El mandato awk y el mandato grep.


Enviar comentarios |  Valorar esta página