Sustitución en archivo de texto **sin** expresiones regulares

Sustitución en archivo de texto **sin** expresiones regulares

Necesito sustituir algo de texto dentro de un archivo de texto con un reemplazo. Normalmente haría algo como

sed -i 's/text/replacement/g' path/to/the/file

El problema es que ambos texty replacementson cadenas complejas que contienen guiones, barras, barras negras, comillas, etc. Si escapo de todos los caracteres necesarios dentro, textla cosa se vuelve rápidamente ilegible. Por otro lado, no necesito el poder de las expresiones regulares: sólo necesito sustituir el texto literalmente.

¿Hay alguna manera de hacer la sustitución de texto?sin¿Usando expresiones regulares con algún comando bash?

Sería bastante trivial escribir un script que haga esto, pero supongo que ya debería existir algo.

Respuesta1

Cuando no necesite el poder de las expresiones regulares, no lo use. Eso está bien.
Pero esto no es realmente unexpresión regular.

sed 's|literal_pattern|replacement_string|g'

Entonces, si /es tu problema, úsalo |y no necesitas escapar del primero.

PD: acerca de los comentarios, consulte también esta respuesta de Stackoverflow enEscapar de una cadena para el patrón de búsqueda sed.


Actualizar: Si estás bien usandoperlaPruébalo con \Qy \Easí,

 perl -pe 's|\Qliteral_pattern\E|replacement_string|g'

@RedGrittyBrick también sugirió un truco similar con una sintaxis Perl más sólida en un comentario.aquíoaquí

Respuesta2

export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file

Esta es la única solución 100% segura aquí porque:

  • Es una sustitución estática, no una expresión regular, no es necesario escapar de nada (por lo tanto, es superior a usar sed)
  • No se romperá si su cadena contiene }caracteres (por lo tanto, superior a una solución Perl enviada)
  • No romperá con ningún carácter, porque ENV['FIND']se usa, no $FIND. Con $FINDo su texto insertado en código Ruby, podría encontrar un error de sintaxis si su cadena contenía un archivo '.

Respuesta3

El replacecomando hará esto.

https://linux.die.net/man/1/replace

Cambio en lugar:

replace text replacement -- path/to/the/file

A la salida estándar:

replace text replacement < path/to/the/file

Ejemplo:

$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi

El replacecomando viene con MySQL o MariaDB.

Respuesta4

También puedes usar \Qel mecanismo de Perl para "metacaracteres de patrón de comillas (deshabilitar)"

perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'

información relacionada