Cuando trabaje con archivos de texto, a menudo necesitará buscar y reemplazar cadenas de texto en uno o más archivos.
sed
es un editor de flujo. Puede realizar manipulación básica de texto en archivos y flujos de entrada, como canalizaciones. Con sed
, puede buscar, encontrar y reemplazar, insertar y eliminar palabras y líneas. Admite expresiones regulares básicas y extendidas que le permiten coincidir con patrones complejos.,
en este artículo, hablaremos sobre cómo encontrar y reemplazar cadenas con sed
. También le mostraremos cómo realizar una búsqueda recursiva y reemplazar.
Buscar y Reemplazar Cadena con sed #
Hay varias versiones de sed
, con algunas diferencias funcionales entre ellos. macOS utiliza la versión BSD, mientras que la mayoría de las distribuciones de Linux vienen con GNU sed
preinstalado por defecto. Usaremos la versión GNU.,
La forma general de búsqueda y sustitución de texto con sed
toma la forma siguiente:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
Por defectosed
escribe su salida a la salida estándar. Esta opción le dice ased
que edite los archivos en su lugar. Si se suministra una extensión (ex-i. bak), se crea una copia de seguridad del archivo original. -
s
– el comando sustituto, probablemente el comando más utilizado en sed. -
/ / /
carácter Delimitador., Puede ser cualquier carácter, pero normalmente se usa la barra diagonal (/
). -
SEARCH_REGEX
– cadena Normal o expresión regular para buscar. -
REPLACEMENT
– La cadena de reemplazo. -
g
– indicador de reemplazo Global. De forma predeterminada,sed
lee el archivo LÍNEA por línea y cambia solo la primera aparición delSEARCH_REGEX
en una línea. Cuando se proporciona el indicador de reemplazo, se reemplazan todas las ocurrencias., -
INPUTFILE
– El nombre del archivo en el que desea ejecutar el comando.
es una buena práctica poner comillas alrededor del argumento para que los meta-caracteres del shell no se expandan.
veamos cómo podemos usar el comando sed
para buscar y reemplazar texto en archivos con algunas de sus opciones y banderas más utilizadas.
para fines de demostración, usaremos el siguiente archivo:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Si el g
indicador se omite, sólo la primera instancia de la cadena de búsqueda en cada línea se sustituye:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Con la sustitución global de la bandera sed
reemplaza todas las ocurrencias del patrón de la búsqueda:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Como te habrás dado cuenta, la subcadena foo
dentro de la etiqueta foobar
string es reemplazado en el ejemplo anterior., Si este no es el comportamiento deseado, use la expresión word-boundary (\b
) en ambos extremos de la cadena de búsqueda. Esto asegura que las palabras parciales no coincidan.
sed -i 's/\bfoo\b/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu foobar 456
para hacer que el patrón sea insensible a mayúsculas y minúsculas, use la bandera I
., En el siguiente ejemplo, estamos utilizando las banderas g
y I
:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Si desea buscar y reemplazar una cadena que contenga el carácter delimitador (/
) necesitará usar la barra invertida (\
) para escapar de la barra. Por ejemplo, para reemplazar /bin/bash
/usr/bin/zsh
utilizaría
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
El más fácil y mucho más legible opción es utilizar otro carácter delimitador., La mayoría de la gente usa la barra vertical (|
) o dos puntos (:
) pero puede usar cualquier otro carácter:
sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt
123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456
También puede usar expresiones regulares. Por ejemplo, para buscar todos los números de 3 dígitos y reemplazarlos con la cadena number
usaría:
sed -i 's/\b\{3\}\b/number/g' file.txt
number Foo foo foo foo /bin/bash demo foobar number
otra característica útil de sed es que puede usar el carácter ampersand &
que corresponde al patrón coincidente., El personaje se puede usar varias veces.
por ejemplo, si desea agregar llaves {}
alrededor de cada número de 3 dígitos, escriba:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Por último, pero no menos importante, siempre es una buena idea hacer una copia de seguridad al editar un archivo con sed
. Para hacer eso, simplemente proporcione una extensión para el archivo de copia de seguridad a la opción -i
., Por ejemplo, para editar el file.txt
y guardar el archivo original como file.txt.bak
usaría:
sed -i.bak 's/foo/linux/g' file.txt
para asegurarse de que se crea la copia de seguridad, enumere los archivos con el comando ls
p>
ls
file.txt file.txt.bak
recursive find and replace #
a veces es posible que desee buscar recursivamente los directorios para los archivos que contienen una cadena y reemplazar la cadena en todos los archivos., Esto se puede hacer usando comandos como find
o grep
para buscar recursivamente archivos en el directorio y canalizar los nombres de archivo a sed
.
el siguiente comando buscará recursivamente los archivos en el directorio de trabajo actual y pasará los nombres de archivo a sed
.,
find . -type f -exec sed -i 's/foo/bar/g' {} +
para evitar problemas con los archivos que contienen espacio en sus nombres, use la opción -print0
, que le dice a find
que imprima el nombre del archivo, seguido de un carácter nulo y canalice la salida a sed
usando xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
para excluir un directorio, utilice la opción -not -path
.,arting with dot (.
), use:
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Si desea buscar y reemplazar solo texto en archivos con una extensión específica, usará:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
otra opción es usar el grep
comando para buscar recursivamente todos los archivos que contienen el patrón de búsqueda y luego canalizar los nombres de archivo a sed
:
grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g'
conclusión #
aunque puede parecer complicado y complejo, al principio, buscar y reemplazar el texto en los archivos con sed
es muy simple.,
para obtener más información sobre sed
comandos, opciones y banderas, visite el manual de GNU sed y el tutorial de Grymoire sed .
Leave a Reply