Fundamentos básicos
El comando sed de Linux es una herramienta强大 que emplea scripts para procesar archivos de texto. La utilidad sed puede ejecutar instrucciones de script para editar y manipular archivos de texto.
Sed se utiliza principalmente para editar automáticamente uno o más archivos, simplificar operaciones repetitivas en archivos y crear programas de conversión.
La sintaxis básica es:
sed [-hnV][-e<script>][-f<archivo_script>][archivo_texto]
Ciclo de procesamiento:
- Lee una línea del flujo de entrada hacia el espacio de patrones.
- Realiza coincidencias y procesa el contenido en el espacio de patrones.
- Emite automáticamante el contenido del espacio de patrones.
- Limpia el contenido del espacio de patrones.
- Lee la siguiente línea del flujo de entrada hacia el espacio de patrones.
En términos simples: las condiciones de coincidencia de texto después de las instrucciones -e se procesan en un entorno temporal. Se ejecutan las instrucciones como -hnvia en este entorno temporal, luego se emite el resultado, se limpia el entorno temporal y se sale. Después, se retorna al primer paso para continuar el ciclo de coincidencia de texto.
Instrucciones principales
Modificadores de comportamiento
- -n: Suprime la salida predeterminada, mostrando solo las líneas procesadas.
- -i: Modifica el archivo directamente. Si no se especifica un archivo de respaldo, modifica el original; de lo contrario, respaldará el archivo original antes de modificarlo.
- -e: Permite ejecutar múltiples comandos simultáneamente.
- -f: Esepcifica un archivo que contiene un conjunto de comandos para que sed procese el flujo de entrada.
- -r: Utiliza expresiones regulares extendidas.
Comandos de edición
- p: Imprime las líneas coincidentes.
- d: Elimina las líneas coincidentes.
- s: Reemplaza el texto coincidente.
- a: Agrega texto después de la línea coincidente.
- i: Inserta texto antes de la línea coincidente.
- q: Sale del comando sed.
- y: Reemplaza caracteres.
- n: Añade manualmente la siguiente línea al espacio de patrones.
- =: Imprime el número de línea.
Expresiones regulares comunes
- .: Coincide con cualquier carácter individual.
- *: Coincide con el carácter precedente cero o más veces.
- +: Coincide con el carácter precedente una o más veces.
- ?: Coincide con el carácter precedente cero o una vez.
- []: Coincide con cualquier carácter del conjunto.
- ^: Coincide con el inicio de línea.
- $: Coincide con el final de línea.
Expresiones de dirección
- N: Especifica un número de línea particular. Sedwill solo procesará esa línea. Hay que tener en cuenta que, a menos que se usen las opciones "-s" o "-i", sednumera consecutivamente todas las líneas de todos los archivos de entrada.
- PRIMERO~PASO: Comenzando desde la línea PRIMERO, toma una línea cada PASOS líneas. Es decir, selecciona líneas cuyos números satisfacen PRIMERO+(N*PASO) (donde N>=0). Para seleccionar todas las impares, usar "1
2"; para comenzar desde la línea 2 y tomar cada 3 líneas, usar "23"; para comenzar desde la línea 10 y tomar cada 5 líneas, usar "105"; y "500" significa seleccionar solo la línea 50. - $: Por defecto, este símbolo coincide con la última línea del último archivo. Si se especifica "-i" o "-s", coincide con la última línea de cada archivo.
- /REGEXP/: Selecciona todas las líneas que pueden ser coincididas por la expresión regular REGEXP. Si REGEXP contiene el carácter "/", debe escaping con barra invertida, es decir, "\\/".
- /REGEXP/I: Igual que "/REGEXP/", pero la coincidencia no distingue entre mayúsculas y minúsculas.
- %REGEXP%: ('%' puede ser reemplazado por cualquier otro carácter individual.) Funciona igual que la expresión anterior, pero usa el símbolo "%" en lugar de "/". Cuando REGEXP contiene el símbolo "/", usar esta expresión evita tener que hacer escape de "/". Sin embargo, si REGEXP contiene el símbolo "%", este debe ser escapado con "\\".
- DIRECC1,+N: Coincide con DIRECC1 y las siguientes N líneas.
- DIRECC1,~N: Coincide con DIRECC1 y las líneas siguientes hasta alcanzar un múltiplo de N. El múltiplo puede ser cualquier entero, siempre que sea el múltiplo de N más cercano y mayor que DIRECC1. Por ejemplo, si DIRECC1=1 y N=3, coincide con las líneas 1-3; si DIRECC1=5 y N=4, coincide con las líneas 5-8. Mientras que "1,+3" coincide con la primera línea y sus 3 líneas siguientes, es decir, las líneas 1-4.
Ejemplos prácticos
Supongamos que el archivo prog.sh contiene lo siguiente:
#!/bin/bash
echo "int main() {
int a = 5;
return 0;
}"
Al ejecutar el comando sed 's/\bint\b/ENTERO/g' prog.sh, el resultado es:
#!/bin/bash
echo "ENTERO main() {
ENTERO a = 5;
return 0;
}"
Explicación de los componentes:
- s: Comando de reemplazo.
- /: Delimitador predeterminado para separar la expresión regular y la cadena de reemplazo.
- \b: Representa el límite de palabra, coincide con el inicio o fin de una palabra.
- int: Cadena a coincidir, se usa límite de palabra \b para asegurar que coincida solo con la palabra "int" aislada.
- /: Segundo delimitador para separar la cadena coincidente de la cadena de reemplazo.
- ENTERO: Cadena de reemplazo.
- g: Coincidencia global, reemplaza todas las cadenas coincidentes, no solo la primera.
Ventana deslizante
El concepto de ventana deslizante en sed implica mantener un tamaño de ventana en el espacio de patrones. Esto comprende dos procesos:
- Rellenar la ventana hasta el número de líneas especificado.
- Deslizar la ventana.
Para esto, se utiliza el espacio de retención como almacenamiento temporal:
- Continuamente se llena la ventana en el espacio de retención.
- Una vez alcanzado el tamaño especificado, la ventana se trae de vuelta al espacio de patrones para deslizar.
- Después de deslizar, se sobrescribe de vuelta al espacio de retención para almacenarlo.
- Se continúa leyendo y llenando la ventana en el espacio de retención, luego se trae de vuelta al espacio de patrones, se desliza y se almacena.
La primera aproximación es más sencilla porque no requiere considerar el intercambio de datos entre los dos espacios repetidamente. Además, es más eficiente porque una vez alcanzado el tamaño de ventana, ya no es necesario intercambiar datos con el espacio de retención.
Para visualizarlo: imagine el espacio de patrones como el explorador de archivos de Windows, donde se añaden carpetas (texto de los archivos) hasta alcanzar un número específico. Mediante el ratón (instrucciones N, D, P para múltiples líneas), se desliza la barra de desplazamiento para seleccionar carpetas y realizar operaciones de eliminación, adición o reemplazo.
Ejemplos de ventana deslizante
1. Dado un archivo datos.txt con el siguiente contenido:
1
2
3
4
5
Al ejecutar sed 'N;s/\n/ /' datos.txt, el resultado es:
1 2
3 4
5
El comando N procesa cada dos líneas como una unidad, reemplazando el salto de línea entre cada par de líneas con un espacio.
2. Al ejecutar echo -e "a\nb\nc\nc\nd\nd\nd\nd\nd\ne" | sed -r '$!N;/^(.*)\n\1$/!P;D', el resultado muestra:
a
b
c
c
d
d
d
d
d
e
Obteniendo después:
a
b
c
d
e
Las líneas repetidas han sido filtradas.
Explicación:
-
-r: Utiliza expresiones regulares extendidas.
-
$!N: Añade la siguiente línea después de cada línea, excepto la última.
-
/^(.*)\n\1$/!P: Si el espacio de patrones no contiene dos líneas repetidas, imprime su contenido.
- ^: Inicio de línea.
- (.*): Coincide con cualquier carácter, cero o más veces, los paréntesis crean un grupo de captura.
- \n: Carácter de salto de línea.
- \1: Referencia inversa al primer grupo de captura.
- $: Final de línea.
Por lo tanto, la expresión regular completa /^(.*)\n\1$/ coincide con dos líneas repetidas, es decir, dos líneas con contenido idéntico separadas por un salto de línea.
-
D: Elimina la primera línea del espacio de patrones y deja el contenido restante para el siguiente ciclo de procesamiento.