Reunido con los Obreros, el Coronel Juan Perón explica sobre la organización para la defensa de sus intereses y explica cómo utilizar el editor de texto comandable sed en Ubuntu.
¡Compañeros!
Un buen trabajador ha de contar en su avío con las mejores herramientas para realizar su justa labor.
Esto lo saben ustedes en cada una de las profesiones. Para ello se han asociado en estas organizaciones; para la defensa de sus intereses. Yo de esto algo he hecho también, aunque como político, yo no soy mas que un mero un aficionado. Mi profesión es la de Conductor.
Pero también he buscado dominar las herramientas que - creo - me puedan servir en un momento u otro para hacer determinadas tareas. Un conductor no ha de contar sólo con un martillo, porque si no a todos los vé clavos.
En la conducción de un sistema computado, sucede mas o menos lo mismo, y esto se replica en los editores de texto. Han de saber que
sed es un editor de cadenas de texto muy extendido en el cómputo arqueológico.
¡Os enseñaré como disponer del poder de sed para editar archivos!
Han de saber que el aprendizaje del comando sed se asemeja al ajedrez: lleva
una ahora aprenderlo, y una vida dominarlo (o, al menos, debe
practicárselo mucho). Con este tutorial aprenderás lo mismo que una
apertura o gambito para cada una de las funcionalidades principales de
sed.
sed es un editor de cadenas capaz de operar
introduciéndole entrada en forma de cadenas (a través de caños), o bien
con ficheros de texto enteros. Como carece de una interfaz interactiva
propia de cualquier editor de texto que se precie moderno, deberán introducir órdenes para
que él interpretará y ejecutará en la medida que avanza sobre el texto.
Gracias a esto podrá operar también sobre el intérprete Bash así como en otros shells.
Con sed será posible:
- Seleccionar
texto
- Sustituír texto
- Agregar líneas al texto
- Borrar líneas de un texto
- Modificar (o preservar) un
fichero original
Se han estructurado estos ejemplos para
presentar y demostrar conceptos, y no para producir los comandos de sed
más rígido (y más complejos) posibles. Incluso así, verás que en sed las
funcionalidades de coincidencia de cadenas y selección de texto operan a
través del uso de expresiones regulares (regexes). Deberías
familiarizarte con ellas para obtener lo mejor de sed.
Un Ejemplo Simple
Primero vamos a usar echo para enviar algún texto a sed
a través de un caño, y haremos que sed sustituya una porción del
texto. Para hacerlo, ingresamos:
echo como_gorilear | sed 's/gorilear/peronizar/'
El comando echo genera una cadena de texto y el caño ("|") envía dicha la cadena "como_gorilear" a sed. Y a continuación le ordena
aplicar una regla de sustitución simple (la "s" significa
sustituir). sed buscará así la cadena de texto especificada en el
texto contenido en el fichero, y reemplazará cualquier coincidencia con
la segunda cadena.
La cadena "gorilear" será reemplazada por "peronizar", y la nueva
cadena será presentada como una salida en la terminal.
Si bien
las sustituciones son probablemente el empleo mas común que se hace de
sed, es conveniente también saber cómo seleccionar y hacer
coincidir texto.
Seleccionar Texto
Utiliza un fichero de texto para nuestro
ejemplo. Usa uno que contiene un poema gauchesco décimas de Martín
Castro, "Hachando los Alambrados". Lo podrán descargar con el comando:
wget https://caja.texto-plano.xyz/peron/hachando.txt
Ingresamos lo siguiente para mirarlo con el comando less:
less hachando.txt
Podremos abandonar el visualizador less presionando la tecla q.
Para seleccionar algunas líneas del
finchero, proveemos la línea inicial y la línea final del rango de
selección. Si usamos un número aislado, sólo seleccionaremos dicha
línea.
Para extraer las diez líneas que componen la primer décima, ingresa este comando:
sed -n '3,12p' hachando.txt
Observad la coma entre 3 y 12. La p significa "presenta las
líneas coincidentes". Si actuase por defecto, sed presentaría
todas las líneas. Veríamos todo el texto en el fichero, y las líneas
coincidentes resultarían impresas dos veces (repetidas). Para impedirlo,
emplea la opción -n ("sin salida") para suprimir todas las líneas
no coincidente.
Ahora cambiarán los números de línea de modo de podeer seleccionar un verso diferente, como se indica:
sed -n '14,23p' hachando.txt
Podrán usar la opción -e ("expresión") para realizar
selecciones múltiples. Si emplean dos expresiones, podrán seleccionar dos
versos, tal como:
sed -n -e '3,12p' -e '14,23p' hachando.txt
Y si reducen el primer número en la segunda
expresión, podrán insertar una línea en blanco entre los dos versos. A tal fin tipeen lo siguiente:
sed -n -e '3,12p' -e '13,23p' hachando.txt
También podrán escoger una línea de comienzo e indicarle a sed
que avance a lo largo del fichero e imprima las líneas alternadamente,
cada cinco líneas, o bien que saltee un número dado de líneas. El comando es
similar a aquellos que empleamos anteriormente para seleccionar un rango.
Para ello habrán de utilizar un tilde (~) en lugar de una coma (,) con el fin de
separar los números.
El primer número indicará el comienzo de la
línea. El segundo número le indicará a sed qué líneas luego de la
línea de comienzo debe presentar. El número 2 significa cada segunda línea,
3 denota cada tercer línea, y así sucesivamente.
Ingresen lo siguiente:
sed -n '1~3p' hachando.txt
Lo normal es que desconozcamos el lugar preciso dónde se localiza un texto buscado, por lo cual suele ser imposible proveer los números de línea. Sin embargo, podremos utilizar sed para seleccionar
las líneas que contienen la cadena de texto buscadas. Por ejemplo, probemos extraer todas las líneas que comienzan con "Y".
El caret
(^) representa el comienzo de una línea. Delimiten el
término a buscar entre barras (/). También incluirán un espacio
luego de "Y", a fin de excluir del filtrado a palabras tales como "Yo".
Tal vez no sea obvio la primera vez que observemos un script de sed. Pero han de recordar que en los comandos
anteriores expliqué que /p significa "presentar", o bien
"imprimir". Sin embargo, ahora una barra la antecede, de esta
manera:
sed -n '/^y /p' hachando.txt
Como resultado de esto se extraerán del archivo quince líneas que comiencen con "y"y se las presentará en la terminal:
Realizar Sustiticiones
En nuestro primer ejemplo, expuse el primer formato básico para usar la
substitución en sed:
echo como_gorilear | sed 's/gorilear/peronizar/'
La s indicaba a sed que lo que viene a
continuación es una sustitución lineal. La primer cadena consistirá en
la cadena a buscar ("origen"), mientras que la segunda cadena será la cadena a reemplazar ("destino"). Por supuesto, como sucede en la política, el problema está en los detalles.
Ingresa entonces el siguiente comando para cambiar
todas las apariciones de la cadena "donde" a "ande", y le daremos a Serapio una voz más pampeana:
sed -n 's/donde/ande/p' hachando.txt
En la primer línea, sólo se cambiará la segunda
ocurrencia de "donde". Eso es así porque sed se detiene luego de encontrar la
primer coincidencia por cada línea. Si queremos realizar una búsqueda
global - tal que se procesen todas las coincidencias existentes en cada
línea del fichero, debemos agregar un modificador g, de la
siguiente manera:
sed -n 's/donde/ande/gp' hachando.txt
Esto encontrará "donde" y lo reemplazará con "ande". Pero si la
palabra fuese "Donde", sed es sensible a mayúsculas, y no
considerararía que dicha instancia sea lo mismo que "donde".
Para
solucionar esto, ingresaremos el siguiente comando, agregándole una
i al final de la expresión que le asigne a la orden
insensibilidad a mayúsculas:
sed -n 's/Donde/donde/gip' hachando.txt
Esto funcionará, pero la mayoría de las veces no querrás activar la
insensibilidad a mayúsculas para todo. En tales casos, podrías usar un
grupo de expresión regular que agregue insensibilidad de mayúsculas a
cadenas específicas.
Por ejemplo, si encierras los caracteres
entre corchetes ([]), serán interpretados como "cualquier caracter de
esta lista de caracteres".
Introduce lo siguiente para incluir
"D" y "d" en el grupo a buscar, de forma de asegurar que en la coincidencia
entren tanto "Donde" como "donde" (o sea, se haga indistinta si está con minúscula o mayúscula "donde":
sed -n 's/[Dd]onde/ande/gp' hachando.txt
También podrás restringir la sustituciones a
determinadas secciones del fichero. Supongamos que el fichero contiene
un espaciado erróneo en su primer décima. Podrás usar entonces el
siguiente comando ya conocido para analizar el primer verso:
sed -n '3,12p' hachando.txt
Buscaremos ahora dos espacios (aparecen luego de "facón"),
sustituyéndolos por uno. Podrán hacer esto globalmente de manera que la acción se
repita a lo largo de toda la primer línea. Para ser mas claro, la cadena
de búsqueda es "espacio, espacio asterisco (*)", y la cadena de
sustitución es "espacio". El
3,12 restringe la sustitución a
únicamente las diez líneas del fichero que componen el primer verso.
Todo esto
tendrá la forma del siguiente comando:
sed -n '3,12 s/ */ /gp' hachando.txt¡Excelente! Lo que importa aquí es
el patrón de búsqueda. El asterisco (*) representa cero o más del
caracter precedente, que es un espacio. por ello, el patrón a buscar
hará que sed analice cadenas de un espacio o más.
Si sustituyes un espacio
simple por cualquier secuencia múltiple de espacios, corregirás el
fichero a un espaciado regular, con un espacio simple entre cada
palabra. En realidad, esto también sustituirá el uso de espacios simples
por otro espacio simple igual, y aunque no es adverso en el resultado,
enlentecerá la sustitución.
Si tipeas lo siguiente y reduces el
patrón de búsqueda a un espacio simple, se hará inmediatamente evidente la necesidad de incluir los dos espacios:
sed -n '3,12 s/ */ /gp' hachando.txtComo el asterisco busca cero o más del caracter precedente,
interpretará cada carácter que no sea un espacio como un "cero espacio"
y le aplicará la sustitución ¡agregando un espacio tras cada
caracter!.
Sin embargo, si incluyes dos espacios en la cadena de
búsqueda, sed deberá encontrar al menos un caracter de espacio antes de
aplicar la substitución. Esto asegurará que los caracteres que no son
espacioes permanezca inalterados.
El texto contiene dos errores. Si ingresas lo siguiente, usando la
-e (expresión) que ya has utilizado anteriormente, podrás
realizar dos o más sustituciones en simultáneo:
sed -n -e 's/gaucho/hombre/gip' -e 's/obrera/overa/gip' hachando.txt
Podrás lograr el mismo resultado utilizando un punto y coma (;) para
separar ambas expresiones, de la siguiente manera:
sed -n
's/gaucho/hombre/gip;s/obrera/overa/gip' hachando.txt
Con esto sustituimos "obrera" por "overa".
En el siguiente comando queremos corregir "la Quiaca". Si
buscamos "la" para reemplazar la Quiaca a La Quiaca, se presentarán
todas las "la" de texto con La (con mayúscula):
sed -n 's/[Ll]a/la/gp' hachando.txt
Para impedir esto, deberás sólo intentar sustituir en líneas que
coincidan con otro patrón. Si modificas el comando para tener una cadena
de búsqueda al comienzo, sólo consideraremos operar en líneas que
coincidan con dicha cadena.
Ingresa lo siguiente para hacer que
tu patrón de búsqueda sea la palabra "Quiaca".
sed -n '/Quiaca/s/[l]a/La/gp' hachando.txt
Esto te dará el resultado
buscado.

También puedes usar el comando Cortar (c) para sustituir
líneas entera que coincidan con la cadena de búsqueda propuesta.
Tipearemos lo siguiente para buscar una línea con la palabra "neck" en
ella, y la reemplazaremos con una nueva cadena de texto:
sed '/pachamama/c el amor de Pachamama.' hachando.txt
Nuestra
nueva línea aparecerá en la parte inferior de nuestro extracto.
Insertar Líneas y Texto
También podremos insertar nuevas
líneas y texto en nuestro fichero. Para insertar líneas nuevas a
continuación de cualquieras que coincidan, usaremos el comando
Agregar (a).
He aquí el fichero con el que queremos
trabajar:
cat hachando.txt
Hemos numerados las líneas
para hacerlo más simple de entender.
Tipea el siguiente comando
para buscar líneas que contengan la palabra "He," e inserta una nueva
línea debajo de ellas:
sed '/Castro/a Poeta uruguayo' hachando.txt
Tipea lo siguiente e incluye el comando Insertar
(i) para insertar la nueva línea por encima de aquellas que
contienen el texto coincidente:
sed '/Castro/i Poesía Gauchesca' hachando.txt
Podemos usar el caracter et o ampersand
("
&"), que representa al texto coincidente original, para
agregar una cadena de texto nuevo a la línea coincidente.
\1 ,
\2 y demás, representan las subexpresiones coincidentes.
Para agregar texto al comienzo de todas las línea, se utiliza un comando de
sustitución que haga coincidir todo en la línea, combinado con una
cláusula de reemplazo que combine nuestro nuevo texto con la línea
original.
Para hacerlo, introduce lo siguiente
sed
's/.*/--> agregado! &/' hachando.txt
Tipea lo siguiente,
incluyendo el comando G, que agregará una línea en blanco entre
cada línea:
sed 'G' hachando.txt
Si deseas agregar
dos, o tres líneas en blanco, puedes usar G;G, G,G,G, y
así.
Borrar líneas
El comando Borrar (d) borra
las líneas que coincidan con el patrón de búsqueda, o aquellas líneas
especificadas números de líneas o rangos de líneas.
Por ejemplo,
para borrar la tercer línea, tipearíamos lo siguiente:
sed
'3d' hachando.txt
Para borrar el rango de líneas siete a la doce,
tipearíamos lo siguiente:
sed '7,12d' hachando.txt
Para
borrar las líneas por fuera de un rango dado, usaríamos un signo de
exclamación, de la siguiente manera:
sed '6,7!d' hachando.txt
Guardar los Cambios
Hasta ahora, todos los
resultados se han presentado en la terminal, pero no los hemos guardado
en ningún lado. Para hacerlos permanente, o bien se pueden guardar los
cambios en el fichero original, o redirigir la salida a un fichero
nuevo.
Sobreescribir el fichero original podría parecer lo obvio a
realizar, pero suele requerir amplios cuidados. Si el comando ingresado
con sed es incorrecto, podría realizar cambios al fichero original que
fuesen muy difíciles de revertir.
Es una buena política instruir
a sed para que cree una copia de respaldo del fichero original antes de
ejecutar cualquier comando.
Puedes usar la opción En el Lugar
(-i) para indicar a sed que escriba los cambios al fichero
original, pero si le agregas una extensión de archivo, sed procederá a
respaldar el fichero original con dicha extensión. Tendrá el mismo
nombre que el fichero original, pero con una nueva extensión.
Para demostrarlo, buscaremos cualquier línea que contiene la palabra "simiente"
y la borraremos. También respaldaremos nuestro fichero original a uno nuevo
aplicándole la extensión .BAK.
Para hacerlo así, han de ingresar lo
siguiente:
sed -i'.bak' '/^.*simiente.*$/d' hachando.txt
Tipeen lo siguiente para asegurarte que tu fichero de respaldo no
presenta cambio alguno.
cat hachando.txt.bak
También podrán tipear el siguiente comando para redirigir la salida a un fichero
nuevo y lograr un resultado similar:
sed -i'.bak'
'/^.*simiente.*$/d' hachando.txt > nuevo_hachando.txt
Utilicen cat
para confirmar que los cambios han sido realizados y escritos en un
fichero nuevo, como se indica a continuación:
cat nuevo_hachando.txt
Habiendo dicho Todo esto
Como han
notado, incluso este pequeño apunte de sed es bastante extenso.
Existen muchas posibilidades para este comando, y existen muchísimas
cosas que pueden realizar con él en pos de la Liberación.
Con suerte, estos conceptos
básicos os habrán provisto de un cimiento sólido sobre el que podréis
continuar aprendiendo. ¡saciando la sed de sed!