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:
- Puede seleccionar el delimitador de caracteres para los patrones. El formato general
de la expresión es:
\?pattern?
donde ? (signo de interrogación) es un delimitador
de caracteres seleccionable.
Puede seleccionar cualquier carácter del entorno local actual excepto el carácter de
espacio o de línea nueva.
El carácter \ (barra inclinada invertida) sólo es necesario para la primera aparición de
? (signo de interrogación).
El formato por omisión para el patrón es el siguiente:
/pattern/
El carácter \ (barra inclinada invertida) no es necesario.
- La secuencia \n coincide un carácter de línea nueva en el
espacio de patrón, excepto el carácter de línea nueva de terminación.
- Un . (punto) coincide con cualquier carácter excepto un
carácter de línea nueva de terminación.
Es decir, a diferencia del mandato ed, que no puede coincidir con
un carácter de línea nueva en medio de una línea, el mandato
sed puede coincidir con un carácter de línea nueva en el espacio de
patrón.
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:
- Una línea de mandatos sin una dirección selecciona todas las líneas.
- Una línea de mandatos con una dirección, expresada en formato de contexto, selecciona
cada línea que coincida con la dirección.
- Una línea de mandatos con dos direcciones separadas por comas selecciona todo el
rango desde la primera línea que coincide con la primera dirección hasta la línea
siguiente que coincide con la segunda.
(Si la segunda dirección es un número menor o igual que el número de línea que se
seleccionó en primer lugar, sólo se selecciona una línea.)
Posteriormente, el proceso se repite al buscar de nuevo la primera dirección.
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:
- 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.
- 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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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
- 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.