Programas de edición de consola

Por más que queramos convencernos de que el usar el comando cat y redirigirlo a un archivo nos va a ser suficiente para poder trabajar con texto no podremos seguir engañándonos por mucho tiempo. Si existe algo que sé a apreciado mucho en lo referente a la informática tanto en el hogar como en la oficina, es la manera más sencilla que se tiene de editar textos y trabajar con ellos de una forma eficiente, produciendo así también una retroalimentación para que estos entornos vayan mejorando. Existen conjuntos de aplicaciones como el OpenOffice.org auspiciado por de Sun o Abiword que nos permiten hacer el trabajo de edición de texto mas fácilmente. Pero también existe toda una gama de editores de textos, en línea y fuera de línea, que permiten hacer el trabajo en ocasiones cuando no se cuenta con ningún otro editor. En este capítulo trataremos de proporcionar una guía sobre las principales herramientas para manipular archivos de texto. El cómo los usemos y cual de ellos adoptemos dependerán de las circunstancias y los gustos del usuario. Los dos primeros editores son el Vi "Visual Editor" y el Emacs con los cuales podremos interactuar para hacer la edición del contenido de un archivo. Luego veremos a un editor de texto fuera de línea y también llamado editor de flujo, el Sed. Por último trataremos de ver las características de un lenguaje de programación que hace mucho mas que editar texto, el Awk.

Edición de textos en modo interactivo

¿Porque es importante el uso de editores de consola?

Muy bien, se cuenta ya con poderosos programas de edición como los mencionados anteriormente y uno se siente tan cómodo como cuando trabajaba en otro tipo de entorno de ventanas, pero ¿Que ocurre cuando queremos hacer funcionar ese monstruo consumidor de recursos en un 486 DX2 con 8 MB?. No puede funcionar de ninguna manera, ni siquiera el entorno XWindow podría hacerlo de un modo que nos facilite las tareas. Otro ejemplo, salimos de nuestra maquina perfectamente equipada y vamos a configurar otra máquina no tan bien equipada, no podemos dejar de hacer el trabajo porque no tiene interfaz gráfica o no tiene el OpenOffice. Por esto es importante el saber usar este tipo de editores, ya que estarán en cualquier sistema GNU/Linux, por lo menos el Vi, y que necesitan de muy pocos recursos o muchos menos que X para funcionar.

El entender este tipo de programas nos abren las puertas para poder configurar y trabajar con cualquier computadora que posea un sistema tipo Un*x ya que han sido portados a tanto Vi como Emacs a la mayoría de las plataformas dada su funcionalidad. Si se les presenta caso que alguna vez se tenga que editar algún archivo a través Internet en una máquina remota agradecerán por mucho la capacidad del editor Vi y su velocidad, dado que es poco el contenido que tendrá que pasarse por la conexión y por ende se tendrá mucha más soltura a la hora de trabajar con un archivo, amen de los bajos tiempos de respuesta que el editor tendrá. Por supuesto que se tendrá que tener en cuenta el gusto personal por cada uno de los editores que pasaremos a explicar, pero de seguro se contará con la suficiente información para poder hacer una elección de acuerdo a las conveniencias de cada usuario.

Para poder ejemplificar algunos de los puntos fuertes de cada uno de estos editores, podríamos decir que Vi es el editor de textos garantizado en todos los equipos con GNU/Linux y Un*x. Aunque no es él más fácil de usar, a esta altura se tendrá la experiencia suficiente para armarse de paciencia y obtener el máximo beneficio de él.

El editor de textos Emacs es pesado pero muy poderoso. Posee hasta un dialecto del lenguaje de programación LISP además de diversas extensiones avanzadas como el Eliza, que es un programa para tareas de Inteligencia Artificial.

El editor Vi

Al verlo por primera vez la gente tiene recuerdos de los primeros editores de textos de DOS, toscos y faltos de muchas características, pero una vez que se a aprendido a usarlo se encuentra uno ubicado en el sector de la gente que piensa que en verdad es un programa mágico.

No es un programa muy difícil de usar, aunque parezca lo contrario en principio, es solo que el aprendizaje inicial suele costar mucho dado que no se contaran con menues descolgables o clic de mouse para ejecutar una función del programa y ni siquiera esta en colores en muchos casos. Para ir viendo algunas características que el Vi posee y a modo de que vayan entrando en el sector de gentes antes mencionado, veremos características en este editor que lo ponen como uno de los más completos. Pero tendremos que ver algunos conceptos fundamentales antes de poder hacer esto. Mientras se este usando el editor se estará en uno de tres posibles modos de operación. Estos modos son:

  1. Modo Comando

  2. Modo de Inserción

  3. Modo de Ultima Línea

Vi puede ser iniciado tanto llamándolo sin argumentos, con lo que se tendrá que establecer un nombre a la hora de salir del programa, o con un nombre de archivo, con lo cual si el archivo existe lo abrirá y si no existe lo creará. La sintaxis es la siguiente
[shrek@pantano:~]$ vi <archivo>
Donde <archivo> es el nombre del archivo a editar o crear. En caso que no se ponga ningún archivo, se preguntara el nombre de este cuando queramos guardar o cuando salgamos del programa. Al iniciarse, lo hará en modo comando por lo que no se podrá ingresar texto directamente. Para pasar al modo de inserción, se cuenta con un comando "i" (INSERT) o "a" (ADD). En ese momento nos encontraremos con la posibilidad de escribir el contenido del archivo a crear o a editar. Para volver al modo de comandos vasta solo con oprimir la tecla ESC.

El modo última línea sirve para proporcionar al Vi ciertos comandos extendidos que aparecerán en la última línea de la pantalla, de aquí su nombre. Por ejemplo, supongamos que quisiéramos salir del archivo que estamos editando sin tener que grabar, para ello presionando dos puntos (:) y luego "q!" el Vi saldrá sin guardar ningún cambio. Por supuesto que en el modo última línea se tiene que presionar la tecla Enter después del comando.

Para entender un poco estos conceptos trataremos de ejemplificar un poco el proceso de edición, mostrando como se editaría un archivo nuevo. Para esto crearemos un archivo llamado prueba:

[shrek@pantano:~]$ vi prueba
Dado que el archivo no existe, este se creará, lo que se nos indica al final de la pantalla con la línea como se ve a continuación

Lo que mostrara el editor Vi al comenzar es una pantalla donde en la primera columna se verán repetidos símbolos de tilde (~). Esto indica que donde está el primero de estos tildes finaliza el archivo y que luego no hay nada más.

En estos momentos estamos en modo de comandos. Para comenzar a trabajar necesitaremos ingresar al modo de inserción para así comenzar a escribir. Esto lo realizamos con el comando i (insert). A la hora de tener que agregar contenido podrá también pasar al modo de inserción a través del comando a (add). La diferencia con el comando i es que con el comando a se comenzará a escribir después del cursor mientras que con el comando i esto se hará antes del cursor. Como en otro editores de textos se podrá seguir escribiendo líneas sucesivas solo con oprimir la tecla Enter la que generara un EOL (End of line). Si existiese un error lo podremos corregir primero borrando el carácter con error (tecla x sobre el carácter a borrar en modo comando) y luego insertando el correcto (i). Pero podremos por ejemplo reemplazar directamente el carácter con error directamente con el comando (r) (replace).

Pero que pasa si existiesen varios caracteres seguidos que quisiéramos corregir. Pondremos entonces el comando R (replace all) lo que nos permitirá seguir reemplazando caracteres hasta presionar la tecla Esc para volver al modo comando.

Para moverse por el texto puede hacerse directamente con las teclas de cursor que nos llevará al lugar donde está el problema.

Para reemplazar esta palabra lo que hicimos fue posicionarnos con el cursor encima de la letra "á" y en modo comando presionar la tecla i, y así insertamos la letra "í". Si lo que quisiéramos es comenzar a escribir una nueva línea en blanco, lo lograremos presionando la tecla o en modo comando.

Ya dijimos que para borrar algún carácter en especial tendremos que posicionar el cursor encima de este y, en modo comando, presionar la tecla x. Pero si lo quisiéramos es borrar una palabra de 5 letras, lo que haremos es presionar x 5 veces. Esto no es del todo practico. Si queremos borrar una palabra completa bastará con posicionarnos con el cursor en ella y presionar dw (delete word) en modo comando con lo que la palabra será borrada. Si lo que queremos es borrar una línea completa tendremos que presionar dd en modo comando encima de la línea a borrar.

Las modificaciones que le podemos hacer al texto las vimos anteriormente con el comando R y r, pero también podremos hacer otro tipo de modificación como el cambiar el texto a mayúscula. Para esto contamos con el comando ~[1], el cual alterna entre mayúsculas y minúsculas.

Para poder mover el cursor de un lado a otro también se cuenta con 4 teclas que pueden resultar un poco más cómodas al este en modo comando. Estas son h, j, k y l que nos permitirán mover el cursor a la izquierda, abajo, arriba y a la derecha. Con la tecla w el cursor se moverá al comienzo de cada palabra y con la tecla b se irá al comienzo de la palabra anterior.

Con la orden 0 nos podremos mover al comienzo de la línea actual y con el $ al final de la línea actual.

En ocasiones el texto que tenemos que editar es por demás de extenso y por ello tendremos que encontrar un método mejor para ir moviéndonos a través de este. Dado que no contamos con una barra de desplazamiento que nos permita poder movernos por el documento tendremos que usar los métodos convencionales de conjunto de comandos. Para ello tenemos que pulsando Ctrl-F se avanzara el cursor una pantalla hacia delante y con Ctrl-B lo llevaremos una pantalla hacia atrás. Si lo que queremos es llegar al final del documento tenemos el comando G y si lo que en realidad se necesitaba es el llegar a una línea determinada tendremos que anteponer al comando G el número de la línea a la que queremos ir. Por ejemplo si quisiéramos llegar a la línea 25 del documento teclearíamos, por supuesto en modo comando, 25G y el cursor parpadeara debajo de la primer letra de esa línea.

Muy bien, el trabajo esta hecho y se necesita ahora guardarlo. Para esto tendremos que darle una orden desde el modo última línea. Para ello primero ingresaremos ":" los dos puntos, que nos llevara al modo última línea y seguido esto teclearemos la letra w (write) y presionaremos Enter (:w), con esto el documento será guardado, y en caso de que no hallásemos dado un nombre todavía, es decir que hayamos arrancado el vi sin ningún nombre como parámetro, se guardara en un archivo temporal el cual nos indicara. Para darle un nombre, lo tendremos que indicar inmediatamente después de haber puesto los dos puntos y la letra w. (:w archivo), de esta forma ahora cada vez que se ingrese el comando "w" desde el modo última línea, se guardara el documento en el nombre de archivo que indicamos. Si lo que quisiéramos es guardar y salir la forma de indicárselo es a través del comando "qw" (:qw) que guardara el archivo y saldrá del programa. Claro esta que si no indicamos un nombre se tendrá que proceder de igual forma que el caso anterior. Podremos hacer lo mismo desde el modo comando presionando dos veces la tecla Z. Para salir sin guardar existen dos formas de acuerdo a lo que se haya hecho. Si no se modifico el documento, bastara que desde el modo ultimo línea se presione la tecla q seguido de Enter.(:q) Si se modifico el documento, entonces deberemos forzar la salida con ayuda del símbolo ! de esta forma (:q!). Lo formidable que tiene este editor de texto en modo consola que otros no tienen, es la posibilidad de editar ficheros múltiples. Esto permite que podamos editar algún otro archivo con solo indicárselo. De esta forma será más rápido que salir del "vi" y arrancarlo con otro nombre de archivo como parámetro. Para esto bastara solo con ingresar :e seguido del nombre del archivo a editar.

Si el archivo que actualmente estamos editando no a sido guardado nos lo indicara para que no perdamos los cambios. Si queremos en realidad incluir el contenido de otro archivo, tenemos la orden :r. La forma de emplearlo es (:r archivo) y de esta forma todo el contenido de ese archivo será incluido en el documento que estamos editando actualmente.

Existe una utilidad muy interesante del vi que nos permite ejecutar comandos del bash directamente y que los resultados se incorporen al texto que estamos editando. Con la misma orden :r! y seguido el comando que queremos ejecutar, el comando será ejecutado y el resultado será incluido en el documento.

Claro esta que se puede salir del interprete de comandos y ejecutar la orden directamente y una vez finalizada volver al editor vi. Esto se logra con el símbolo "!". Por ejemplo: :! ls -l . También podremos salir temporalmente del vi regresar al interprete de comandos. Para esto deberemos indicárselo con el comando :shell. Luego una vez que terminemos de usar el interprete de comandos, podremos poner exit y regresaremos al vi.

Una utilidad interesante es la de repetir el último comando que se ejecutó. Para esto tenemos el comando punto "." que desde el modo comando nos permitirá repetir cualquier comando que hayamos ejecutado anteriormente. Por ejemplo si lo que hicimos antes fue el borrar una palabra con el comando "dw", si presionamos el punto "." será igual que hubiésemos tecleado "dw" otra vez. Esto funciona con la mayoría de los comando que podamos ejecutar desde el modo comando.

Si quisiéramos buscar una palabra en especial dentro del texto, bastara solo con presionar la el comando "/" lo que nos ubicará en la última línea para que ingresemos la cadena de texto a encontrar. Vi comenzara a buscar desde el punto donde se encuentre el cursor hasta el final del texto y cada vez que encuentra una coincidencia nos lo indicara poniendo el cursor debajo de esta. Si queremos seguir buscando, bastara con presionar la tecla n (next) para que encuentre la próxima coincidencia.

Muchas veces tendremos que reemplazar sucesivamente una palabra en el texto y tendremos que buscarlo una por una y reemplazarlo a mano. Vi cuenta con un método que puede ser útil usando la diagonal "/" y luego la cadena que estamos buscado. Una vez que la encontramos solo tendremos que presionar "cw" lo que nos permitirá corregir la cadena, reemplazamos la cadena que encontramos con la que queremos y luego repetimos la búsqueda presionando (ESC) que nos pondrá en modo comando y presionando la tecla "n" que nos llevara a la próxima coincidencia. En este punto en lugar de repetir lo anterior solo bastara con presionar el comando "." que repetirá el reemplazo efectuado anteriormente y así presionando "n" y "." sucesivamente podremos reemplazar todas las coincidencias.

Claro esta que no es esto muy útil si se quiere reemplazar 100 coincidencias por lo que podremos hacerlo de una sola vez indicando en cuantas líneas se podrá encontrar esta cadena. Para ello se ingresan los ":" dos puntos seguido de la primera de las líneas en la que tenemos la palabra a cambiar, seguido una coma y luego la ultima línea a cambiar. Luego pondremos el comando a usar "s" para sustituir, una diagonal, la palabra a buscar otra diagonal y la palabra con la que será reemplazada.

:200s/shrek/SHREK

Claro que esto solo cambiara la primer aparición en la línea, si existiera otra en la misma línea seria ignorada. Para que el alcance sea total se deberá agregar el comando g (global) al final del comando.

:1,200s/shrek/SHREK/g

Ahora bien si se quiere que vi nos pregunte antes de cambiar se deberá agregar el comando "c" al final, que nos pregunte si se quiere realizar el cambio antes de cada una de las coincidencias

:1,200s/shrek/SHREK/gc

Para todo esto deberemos saber cuantas líneas tiene el documento, lo que podemos hacer es indicarle que lo haga desde donde nosotros queramos hasta el final del documento con la ayuda del símbolo "$".

:1,$s/sebas/SEBAS/gc

Si se quiere realizar en todo el documento, podremos directamente indicarlo con el símbolo "%" que es igual a "1,$".

:%s/shrek/SHREK/gc

Por supuesto que los patrones de búsqueda que usamos podrán ser expresiones regulares, que facilitaran mucho el trabajo. Si quisiéramos que se reemplace no importa si esta escrito en mayúscula o minúscula se podrá poner algo como esto

:%s/[Ss][Hh][Rr][Ee][Kk]/fiona/gc

Este uso de las expresiones regulares también puede incluir el uso de metacaracteres como el "*" para indicar cualquier cantidad de caracteres anterior o "." para cualquier carácter individual

:%s/*[Rr].[Ss]/fiona/gc

Pero si se a hecho algo mal, no preocuparse ya que Vi cuenta con un comando de "undo" el cual por supuesto se activa con el comando "u". Existen muchísimos temas que se han dejado de ver aquí, por lo que se invita al lector a buscar en la documentación del vi que lo guiara a toda la magia que este editor tiene para brindar.

El editor emacs

En cuanto a poder se refiere, Emacs gana por varios cuerpos a sus competidores. Este desarrollo totalmente GNU ha sabido cubrir el terreno de la edición de textos de alto nivel en los sistemas UNIX por muchos años, y sigue siendo un ejemplo del poder real que se puede obtener de este tipo de sistemas. Por supuesto, es un editor más poderoso que el pequeño "vi" y por ende la curva de aprendizaje es mucho mayor. Pero si lo que se quiere es tener mas que un simple editor de textos y acercarse a lo que una suite de aplicaciones puede dar, Emacs es el lugar donde se tiene que buscar. Y es así de simple, no solo nos encontraremos con un fabuloso editor de textos, sino que tendremos una completa suite de aplicaciones de uso común, tales como edición, recepción y envió de mails, programación en C, edición de HTML y SGML, programación en de macros en lenguaje LISP, corrección ortográfica en varios idiomas y muchas características más. Existe una diferencia en la forma de trabajar con respecto a vi, en lugar de tener que cambiar de modo para poder trabajar con una u otra función, modo comando, modo última línea y demás, emacs responde de acuerdo a la función que la combinación de teclas presionada tenga. Este es el mismo comportamiento que poseen otros editores de textos como el OpenOffice o el Word y por lo tanto se tendrán que saber las combinaciones posibles para poder trabajar cómodamente.

Al arrancar emacs puede hacerlo de dos formas distintas dependiendo en el ambiente donde se este trabajando. Si se esta trabajando en modo texto, emacs arrancara con lo que se denomina entorno de pantalla completa, es decir se llena toda la pantalla.Si se ejecuta emacs en el entorno X, este lo entenderá y arrancará la versión de X en lugar de la de texto.

Versión X de Emacs: Por supuesto que si se quiere ejecutar la versión de texto en un entorno como X uno puede hacerlo, para ello basta con ejecutar emacs con los modificadores -nw (NO WINDOWS).

[shrek@pantano:~]$ emacs -nw

Ahora bien, si lo ejecutamos con un nombre de archivo como argumento resultara de la misma forma que con el editor vi, si el archivo existe se abrirá para ser editado, si no se creará uno nuevo. En el entorno gráfico se podrá contar con una serie de menús desplegables al igual que otros programas de X y así será más fácil llegar a las opciones, y por ello solo trataremos de ver las opciones que se tienen, no todas, para ser usadas en un entorno de texto y luego podrán ser empleadas ya conociendo su funcionamiento en cualquiera de los dos entornos.

Para poder usar los menú en modo texto, si presionamos la tecla F10 tendremos bajo la pantalla de edición los nombres de cada uno de los menús y al elegirlos y presionar Enter entraremos en su contenido y en las diversas ordenes que tienen. Con F1 entraremos al modo de ayuda donde tendremos una reseña de los comandos de Emcas Ventana de ayuda Para salir de este cuadro bastara con presionar 3 veces la tecla Esc.

Al comenzar, emacs esta en lo que se denomina modo "fundamental" que es uno de los modos en los que puede encontrarse dependiendo del tipo de trabajo que se esta haciendo, determinando esto el comportamiento básico del programa. Los otros modos sirven para efectuar las distintas tareas antes mencionadas como el leer correo, la edición de HTML y compilación de lenguaje C. La forma de saber en que modo se encuentra, es leyendo la línea de estado.

Para movernos dentro del documento tenemos as facilidades de las teclas de cursor o bien diciéndole hacia donde tiene que ir el curso mediante un comando. Por ejemplo si quisiera ir hacia adelante palabra a palabra teclearíamos Esc-f (f de forward) y nos iremos moviendo de esa manera. A modo inverso teclearemos Esc-b para ir hacia atrás. Para moverse hacia arriba y hacia abajo podremos hacerlo por medio de Ctrl-v para ir una pantalla adelante y Esc-v para ir una pantalla hacia atrás. Solo se tendrá que recordar que para ingresar un comando que comienza con la tecla Shift, antes deberemos presionar la tecla Esc. A continuación mostraremos una tabla básica de movimientos para emacs.

Tabla 1. Reseña de teclas en emacs para movimiento

CaracterAcción
Ctrl-bSe mueve atrás un caracter
Ctrl-fSe mueve adelante un caracter
Esc-bSe mueve atrás una palabra
Esc-fSe mueve adelante una palabra
Ctrl-pSe mueve a la línea anterior
Ctrl-nSe mueve a la línea siguiente
Ctrl-aSe mueve al inicio de la línea
Ctrl-eSe mueve al final de la línea
Ctrl-vSe mueve hacia adelante una pantalla
Esc-vSe mueve hacia atrás una pantalla
Esc->Se mueve al final del buffer (archivo)
Esc-<Se mueve al inicia del buffer (archivo)

La edición de texto es muy completa, permitiendo marcar un fragmento del texto para copiarlo o cortarlo para pegarlo en otro lugar del documento. El texto cortado o copiado permanece en un buffer del procesador de texto y no tiene que ser único. Por ende podríamos tener varios fragmentos de texto en él y podrimos pegar cualquiera de ellos. La diferencia con otros editores de texto esta en que el proceso de pegar el contenido del portapapeles se denomina yanking (jalar). La siguiente tabla muestra los comando para edición más comunes.

Tabla 2. Reseña de teclas en emacs de edición

CaracterAcción
Ctrl-dBorra el caracter que está debajo del cursor
DelBorra el caracter anterior
Esc-DelBorra la palabra anterior
Esc-dBorra la palabra sobre la que está el cursor
Ctrl-kBorra la línea
Ctrl-wBorra la región marcada
Esc-wCopia la región marcada
Ctrl-yInserta el texto en el buffer del portapapeles
Ctrl-@Asigna el inicio de una región
Ctrl-EspacioCompletar !!!!!!!!

Como en el procesador de textos Vi, tendremos la posibilidad de buscar un texto determinado, pero de una forma un poco mas cómoda, ya que emacs incorpora lo que se denomina búsqueda incremental (I-search). Este tipo de búsqueda se irá haciendo en tiempo real a medida que vayamos poniendo caracteres luego de presionar Ctrl-s, lo que inicia la búsqueda, buscando una concordancia. Bajo la línea inferior aparecerá una referencia de esta forma

I-search: 

A medida que pongamos caracteres los iremos viendo luego de esa línea:

I-search: o
Y en el texto el cursor se ira desplazando a la primer palabra que comience con "o". Así a medida que se ingresen caracteres, emacs nos llevara hacia la primer palabra que concuerde. Si al terminar de escribir la palabra, todavía no se a llegado a la región donde se quería, bastara con teclear nuevamente Ctrl-s y emacs buscara la próxima ocurrencia de la palabra buscada anteriormente. Por supuesto la búsqueda es mas útil si se la puede usar para reemplazar algún texto en el documento, y esto es posible en emacs a través del comando Shift-% con lo que se pedirá primero el texto a buscar y luego el texto por el que será reemplazado. A continuación mostraremos una tabla que muestra las posibilidades de búsqueda y reemplazo que emacs posee.

Tabla 3. Teclas de emacs en modo búsqueda

CaracterAcción
Ctrl-sBusca hacia adelante en forma incremental
Ctrl-rBusca hacia atrás en forma incremental
Esc-oTermina la búsqueda
Espacio-oReemplaza la cadena preguntando antes de hacerlo
Ctrl-gCancela la búsqueda y regresa al inicio
DelPara borrar un caracter incorrecto en la cadena de búsqueda
Esc-%Se ingresa la cadena a buscar y el reemplazo
Shift-xCambia todas la ocurrencias del documento

Existe muchas funciones más y queda para el lector si es de su interés el estudio del lenguaje incorporado LISP par la generación de funciones y macros que serán de mucha ayuda para usar este editor.

Notas

[1]

En los teclados españoles, el símbolo de tilde (~) suele obtenerse presionando AltGr-4