La utilidad sed (editor de flujo) es una herramienta de análisis y transformación de texto orientada a líneas. El comando sed utiliza un lenguaje de programación simple y expresiones regulares para procesar flujos de texto y archivos. La característica más utilizada del comando sed es la sustitución de cadenas.
Esta guía muestra cómo usar sed para buscar y reemplazar cadenas a través de ejemplos.
Prerrequisitos
- Acceso a la línea de comandos/terminal.
- Un archivo de texto (esta guía proporciona un archivo example.txt).
- Comandos básicos del terminal (obtén nuestra hoja de trucos gratuita).
Sintaxis de Sed para buscar y reemplazar
La sintaxis para buscar y reemplazar texto usando el comando sed es:
sed -i 's/<regex de búsqueda>/<reemplazo>/g' <archivo de entrada>
El comando consta de lo siguiente:
- -i indica al comando sed que escriba los resultados en un archivo en lugar de la salida estándar.
- s indica el comando de sustitución.
- / es el delimitador más común. El comando también acepta otros caracteres como delimitadores, lo cual es útil cuando la cadena contiene barras inclinadas.
- <regex de búsqueda> es el parámetro de búsqueda de cadena o expresión regular.
- <reemplazo> es el texto de reemplazo.
- g es la bandera de reemplazo global, que reemplaza todas las ocurrencias de una cadena en lugar de solo la primera.
- <archivo de entrada> es el archivo donde ocurre la búsqueda y el reemplazo.
Las comillas simples ayudan a evitar la expansión de metacaracteres en el shell.
La versión BDS de sed (que incluye macOS) no admite coincidencias sin distinción de mayúsculas ni reemplazo de archivos. El comando para el reemplazo de archivos es así:
sed 's/<regex de búsqueda>/<reemplazo>/g' <archivo de entrada> > <archivo de salida>
Alternativamente, instala la versión GNU de sed en macOS con homebrew:
brew install gnu-sed
Ejecuta el comando GNU sed de la siguiente manera:
gsed -i 's/<regex de búsqueda>/<reemplazo>/g' <archivo de entrada>
Reemplaza el comando sed con gsed para seguir los ejemplos a continuación.
Ejemplos de reemplazo con Sed
Los ejemplos de esta guía utilizan un archivo de muestra para reemplazar cadenas.
- Crea un archivo de texto de muestra:
nano example.txt
- Agrega el siguiente contenido:
foobarbazfoobarbaz foo bar baz foo bar baz Foo Bar Baz Foo Bar Baz FOO BAR BAZ FOO BAR BAZ /foo/bar/baz /foo/bar/baz
- Crea un archivo de texto de muestra:
Usa el archivo como entrada para probar los ejemplos a continuación.
Reemplazar la primera cadena coincidente:
- Para reemplazar la primera instancia encontrada de la palabra bar con linux en cada línea de un archivo, ejecuta:
sed -i 's/bar/linux/' example.txt
- La etiqueta -i inserta los cambios en el archivo example.txt. Verifica el contenido del archivo con el comando cat:
cat example.txt
El comando reemplaza la primera instancia de bar con linux en cada línea, incluyendo subcadenas. La coincidencia es exacta, ignorando las variaciones de capitalización.
Reemplazo global
Para reemplazar cada coincidencia de cadena en un archivo, añade la bandera g al script. Por ejemplo:
sed -i 's/bar/linux/g' example.txt
El comando reemplaza globalmente cada instancia de bar con linux en el archivo.
Haga coincidir y reemplace todos los casos
Para encontrar y reemplazar todas las instancias de una palabra e ignorar la capitalización, usa el parámetro I:
sed -i 's/bar/linux/gI' example.txt
El comando reemplaza todas las instancias de la palabra bar en el texto, ignorando la capitalización.
Ignorar subcadenas
Añade límites de palabra (\b) al comando sed para ignorar subcadenas al reemplazar cadenas en un archivo. Por ejemplo:
sed -i 's/\bbar\b/linux/gI' example.txt
Alternativamente, cambia el delimitador para hacer el comando más fácil de leer:
sed -i 's:\bbar\b:linux:gI' example.txt
El comando ignora subcadenas, coincidiendo solo con la palabra completa.
Buscar y reemplazar cadenas con barras
Escapa el carácter de barra inclinada para buscar y reemplazar una cadena con barras. Por ejemplo, para reemplazar /foo/bar/baz con /home/kb, usa la siguiente sintaxis:
sed -i 's/\/foo\/bar\/baz/\/home\/kb/g' example.txt
Alternativamente, cambia el delimitador para evitar escapar caracteres:
sed -i 's:/foo/bar/baz:/home/kb:g' example.txt
Usa esta sintaxis para reemplazar rutas y otras cadenas con barras.
Buscar y reemplazar con expresiones regulares
El patrón de búsqueda para el comando sed acepta expresiones regulares, similares a grep regex. Por ejemplo, para coincidir con todas las letras mayúsculas y reemplazarlas con 5, usa:
sed -i 's/[A-Z]/5/g' example.txt
El patrón regex ayuda a encontrar todas las letras mayúsculas y las reemplaza con el número en el archivo.
Referencia a la cadena encontrada
Usa el carácter ampersand (&) para hacer referencia a la cadena encontrada. Por ejemplo, para agregar una barra inclinada (/) antes de cada instancia de foo en un archivo, usa:
sed -i 's/foo/\/&/gI' example.txt
En lugar de volver a escribir el parámetro de búsqueda, el signo & hace referencia a la cadena encontrada.
Crea una copia de seguridad
Para crear un archivo de copia de seguridad antes de sobrescribir el existente, añade el parámetro .bak a la etiqueta -i.
sed -i.bak 's/foo/FOO/g' example.txt
El comando crea una copia de seguridad (example.txt.bak) antes de sobrescribir el original. Usa este método para mantener una copia en el formato original y evitar sobrescribir.
Buscar y reemplazar de forma recursiva
Usa el comando find para buscar archivos y combínalo con sed para reemplazar cadenas en archivos de forma recursiva. Por ejemplo:
find -name 'example*' -exec sed -i 's/[a-z]/5/gI' {} +
El comando encuentra todos los archivos que comienzan con example y ejecuta el comando sed en los archivos. El comando ejecutado reemplaza todas las letras con 5, ignorando la capitalización.
Después de revisar los ejemplos en esta guía, sabes cómo usar sed para reemplazar cadenas en archivos. El comando sed es una poderosa utilidad de manipulación de texto con muchas características avanzadas.