El editor ed
fue hecho con la idea de tener un editor
rápido y pequeño con lo mínimo indispensable. Es, además, un editor
confiable y que puede ser usado en las peores condiciones: con
terminales lentas, en conexiones por modem y, quizá la más
interesante, desde archivos por bloques. La mayoría de los editores
asumen que toman la entrada directa desde el teclado y que controlan
una terminal, por esto no pueden ser empleados como ed
.
En su modo de operación normal, trabajan sobre una copia del archivo, para sobreescribirlo, hay que dar una instrucción específica. Trabaja ssobre una línea o un grupo de líneas que cumplan con un patrón. Cada comando es un solo carácter, típicamente una letra. Cada comando puede ser precedido por uno o dos números de línea, que indican la línea o el rango de líneas al que serán aplicados. De no ser dado el número de línea, actúa sobre la actual. Veamos un ejemplo:
$ ed a Cuando abandonaste el cielo ?Donde dejaste tus alas? Cuando abandonaste el cielo Quisiera saberlo, ?perdiste el halo? ?Como encontraste el camino? ?Aun te escondes cuando sale el sol? Cuando abandonaste el cielo ?Perdiste las alas? . w angel 233 q $
Después de invocar a ed
inmediatamente le pedimos que
añada el texto con el comando a
y comenzamos a guardar el texto
de un pequeño poema. Terminamos poniendo un .
como único
carácter en la línea y después le pedimos que salve el archivo con el
nombre de angel
. ed
nos responde con el número de
carácteres que contiene, y terminamos la sesión de edición con una
q
.
Si quisieramos añadir unas cuantas líneas más, podríamos hacerlo con:
$ ed angel 233 a Ahora veo a un largo tren venir despacio y una muerte agradecida que me reconforta dime Reina Ines ?vendras a verme? El amigo del diablo es amigo mio . q ? w 384 q $
En esta ocasión, invocamos a ed
directamente con el
nombre de un archivo que ya existe, así que nos responde con el número
de carácteres que contiene el archivo. Comenzamos a añadir unas
líneas, nos detenemos y tratamos de salirnos. Esta vez ed
nos
avisa con ?
que el archivo no ha sido salvado. No debemos
esperar una comunicación más comprensible de ed
. Su manera de
avisarnos que algo no le gusta o que las cosas no van bien es con un
críptico ?
. En este caso una segunda q
le indicaría que
realmente nos queremos salir sin salvar los cambios que hicimos. En
todo momento una Q
le indica a ed
que deseamos terminar
la sesión sin guardar los cambios.
Cuando queremos revisar el texto ya escrito, le podemos pedir
que imprima las líneas en un cierto rango con la instrucción
a,bp
donde a
y b
son números de línea. Por
ejemplo, para ver la segunda estrofa:
$ ed angel 384 6,9p ?Como encontraste el camino? ?Aun te escondes cuando sale el sol? Cuando abandonaste el cielo ?Perdiste las alas? .,$p ?Perdiste las alas? Ahora veo a un largo tren venir despacio y una muerte agradecida que me reconforta dime Reina Ines ?vendras a verme? El amigo del diablo es amigo mio q $
Los carácteres .
y $
tienen el significado
especial de ser la línea actual y la última línea respectivamente como
podemos ver en la segunda parte del ejemplo.
Si damos un enter por si sólo o un -
seguido de un
enter, nos lista la siguiente línea y la anterior respectivamente,
moviéndose hacia adelante y hacia atrás en el archivo. No permite
moverse más allá de la primera y de la última línea, ni imprimirlas en
orden inverso.
Podemos hacer búsquedas utilizando los operadores
/patron/
y ?patron?
hacia adelante y hacia atrás
respectivamente. Una vez que encontramos el primero, podemos traer el
siguiente con las formas //
y ??
.
$ ed angel 384 /con/ ?Como encontraste el camino? // ?Aun te escondes cuando sale el sol? // y una muerte agradecida que me reconforta ?alas? ?Donde dejaste tus alas? ?? ?Perdiste las alas? q $
Y podemos usar una búsqueda como parte de un rango:
1,/saber/p Cuando abandonaste el cielo ?Donde dejaste tus alas? Cuando abandonaste el cielo Quisiera saberlo, ?perdiste el halo? .-1,.+3p Cuando abandonaste el cielo Quisiera saberlo, ?perdiste el halo? ?Como encontraste el camino? ?Aun te escondes cuando sale el sol?
Y como vemos, también podemos usar el .
como ancla e
imprimir de la línea anterior a tres más adelante de la actual.
La forma genérica de los comandos es número de línea o rango
seguido del comando. Para añadir a partir de una línea a partir de
línea se usa #a
, para insertar antes de la línea
#i
. Para borrar el rango de líneas de la i-ésima a la j-ésima
i,jd
y i,jc
para reemplazar el rango de líneas por las
que se dan a continuación.
Para hacer reemplazos en base a patrones se utiliza s/viejo/nuevo/:
2p ?Donde dejaste tus alas? 2s/alas/celtas/ 2p ?Donde dejaste tus celtas?
Después del cambio se puede usar el modificador g
para que haga el reemplazo en todas las ocurrencias de la línea o en
todas las ocurrencias en el rango de las líneas: s/viejo/nuevo/g. Por supuesto que la sintáxis es extensible a rangos
delimitados por patrones de búsqueda: 4,9s/viejo/nuevo/
,
1,$s/viejo/nuevo/
, 1,/viejo/s/viejo/nuevo/, etc.
Cuando necesitamos incluir el patrón viejo dentro del nuevo,
no necesitamos reteclearlo, el carácter &
toma el valor:
2p ?Donde dejaste tus alas? 2s/alas/& marchitas/p ?Donde dejaste tus alas marchitas?
Y como vemos, la p
después del comando de reemplazo
imprime la línea.
Para copiar y mover bloques, tenemos las instrucciones
i,jtk
i,jmk
donde el primero copia las líneas en el
rango de la i-ésima a la j-ésima después de la línea k-ésima. Igual en
el segundo caso, pero borrandólas de su posición original.
También podemos incluir un archivo en el actual con la
instrucción r
en la forma nr archivo
con la cual lo
insertamos en el actual a partir de la línea n-ésima.
Con i,jw archivo
copiamos de la línea i-ésima a la
j-ésima en el archivo denominado. Con i,jW archivo
copiamos de
la línea i-ésima a la j-ésima al final del archivo denominado.