SED
SED significa «Stream EDitor» (editor de flujos). Podemos pensar en SED como un objeto al cual le damos instrucciones y un flujo de datos (por ejemplo, un archivo), sobre el cual SED opera dichas instrucciones.
Las próximas lineas pretenden dar una muy breve introducción a SED, a través de simples ejemplos de uso. Pero, entendiendo la estructura de esos ejemplos, es posible luego construir instrucciones mas complejas. Por supuesto, usando Google uno puede encontrar bastante mas información sobre este extremadamente útil y potente editor.
En lo que sigue, 'in' se refiere al nombre de un archivo existente, y 'out' a uno no existente, a ser creado por el comando.
1) Reemplazar la cadena ‘AAA’ por la cadena ‘BBB’ en el archivo (solo la primera ocurrencia en cada linea):
sed 's/AAA/BBB/' < in
2) Reemplazar todas las ocurrencias de la cadena 'AAA' por la cadena 'BBB' en el archivo ('g' significa 'Global'):
sed 's/AAA/BBB/g' < in
3) Reemplazar todas las ocurrencias de la cadena 'AAA' por la cadena 'BBB' en el archivo, ignorando la capitalización ('I' significa 'Ignore case'):
sed 's/AAA/BBB/gI' < in
4) Remover lineas conteniendo la cadena 'AAA' del archivo:
sed '/AAA/ d' in > out
5) Remover lineas conteniendo la cadena 'AAA' del archivo, ignorando la capitalización ('d' significa 'Delete'):
sed '/AAA/I d' in > out
6) Remover lineas vacías del archivo ('^$' significa 'linea vacía'):
sed '/^$/ d' in > out
7) Remover todo entre las lineas 11 y el fin del archivo ('$' significa 'ultima linea'):
sed '11,$ d' < in
8) Imprimir solo la linea 10 del archivo:
sed -n '10p' in
9) Imprimir las lineas que contengan abc o ABC o aBc o ABc, etc:
sed -n '/abc/I p' in > out
Algunas aplicaciones de SED en bash
10) Remover lineas vacías (solo lineas vacías, no lineas con espacios) de todos los archivos cuyos nombres terminan en txt, y dar a los nuevos archivos el mismo nombre, pero con el prefijo 'tmp':
for i in *.txt; do sed '/^$/d' tmp$i; done > out
11) Remover la cadena ‘algo’ de todos los archivos cuyos nombres terminan en txt, y dar a los nuevos archivos el mismo nombre, pero con el prefijo 'tmp':
for i in *.txt; do sed -e 's/algo//' tmp$i;done