macos replace sed case-insensitive

macos - Búsqueda insensible a mayúsculas y sustitúyela por sed



replace case-insensitive (7)

Capitalice el ''yo''.

sed ''s/foo/bar/I'' file

Intento usar SED para extraer texto de un archivo de registro.

Puedo buscar y reemplazar sin demasiados problemas:

sed ''s/foo/bar/'' mylog.txt

Sin embargo, quiero hacer que la búsqueda no distinga entre mayúsculas y minúsculas. De lo que he buscado en Google, parece que agregar "i" al final del comando debería funcionar:

sed ''s/foo/bar/i'' mylog.txt

Sin embargo, esto me da un mensaje de error:

sed: 1: "s/foo/bar/i": bad flag in substitute command: ''i''

¿Qué está mal aquí, y cómo lo soluciono?

Estoy en OS X, en caso de que importe.


La versión Mac de sed parece un poco limitada. Una forma de evitar esto es utilizar un contenedor de Linux (a través de Docker) que tiene una versión utilizable de sed :

cat your_file.txt | docker run -i busybox /bin/sed -r ''s/[0-9]{4}/****/Ig''


Otra gsed para sed en Mac OS X es instalar gsed desde MacPorts o HomeBrew y luego crear el alias sed=''gsed'' .


Para ser claros: en macOS , a partir de Sierra (10.12), sed , que es la implementación de BSD , NO admite coincidencias que no distinguen entre mayúsculas y minúsculas , es difícil de creer, pero cierto. La respuesta aceptada anteriormente , que a su vez muestra un comando GNU sed , ganó ese estado debido a la solución basada en perl mencionada en los comentarios.

Para que esa solución de Perl funcione también con caracteres extranjeros , a través de UTF-8, use algo como:

perl -C -Mutf8 -pe ''s/öœ/oo/i'' <<< "FÖŒ" # -> "Foo"

  • -C activa el soporte UTF-8 para transmisiones y archivos, suponiendo que la configuración regional actual está basada en UTF-8.
  • -Mutf8 le dice a Perl que interprete el código fuente como UTF-8 (en este caso, la cadena pasó a -pe ) - este es el equivalente más corto de la más -e ''use utf8;''. Gracias, Mark Reed

(Tenga en cuenta que el uso de awk tampoco es una opción , ya que awk en macOS (es decir, BWK awk , también conocido como BSD awk ) parece ser completamente ajeno a las configuraciones regionales; sus funciones tolower() y toupper() ignoran caracteres extraños (y sub() / gsub() no tienen indicadores de insensibilidad a mayúsculas / minúsculas para empezar).)


Si está haciendo una coincidencia de patrones, por ejemplo, / pattern / s / xx / yy / g

entonces quieres poner la "I" después del patrón / patrón / Is / xx / aa / g

ejemplo: echo Fred | sed ''/ fred / Is // willma / g'' devuelve willma ... sin que yo devuelva la cadena intacta (Fred)


Tenía una necesidad similar, y se me ocurrió esto:

este comando simplemente para encontrar todos los archivos:

grep -i -l -r foo ./*

este para excluir this_shell.sh (en caso de que ponga el comando en un script llamado this_shell.sh ), coloque el resultado en la consola para ver qué sucedió, y luego use sed en cada nombre de archivo que se encuentre para reemplazar el texto foo con barra :

grep -i -l -r --exclude "this_shell.sh" foo ./* | tee /dev/fd/2 | while read -r x; do sed -b -i ''s/foo/bar/gi'' "$x"; done

Elegí este método, ya que no me gusta tener todas las marcas de tiempo modificadas para los archivos no modificados. Al alimentar el resultado de grep, solo se pueden ver los archivos con el texto de destino (por lo tanto, es probable que también mejore el rendimiento / velocidad)

asegúrese de hacer una copia de seguridad de sus archivos y probarlos antes de usarlos. Puede no funcionar en algunos entornos para archivos con espacios integrados. (?)


sed ''s / string1 / string2 / Ig'' Capital I es una opción que es útil para buscar una cadena independientemente de la distinción de mayúsculas y minúsculas.