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 text
y replacement
son cadenas complejas que contienen guiones, barras, barras negras, comillas, etc. Si escapo de todos los caracteres necesarios dentro, text
la 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 \Q
y \E
así,
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$FIND
o su texto insertado en código Ruby, podría encontrar un error de sintaxis si su cadena contenía un archivo'
.
Respuesta3
El replace
comando 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 replace
comando viene con MySQL o MariaDB.
Respuesta4
También puedes usar \Q
el 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'