Editor Ed Unix V7

por | 29 marzo, 2007

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.