Necesito sustituir algo de texto dentro de un archivo de texto con un reemplazo. Por lo general, haría algo como
sed -i 's/text/replacement/g' path/to/the/file
El problema es que tanto text
y replacement
son cadenas complejas que contienen guiones, barras, blackslashes, citas y así sucesivamente. Si escapo, todos los personajes necesarios dentro de text
la cosa se vuelven rápidamente ilegibles. Por otro lado, no necesito el poder de las expresiones regulares: solo necesito sustituir el texto literalmente.
¿Hay alguna forma de hacer una sustitución de texto sin usar expresiones regulares con algún comando bash?
Sería bastante trivial escribir un guión que haga esto, pero creo que ya debería existir algo.
bash
regex
sed
text-editing
Andrea
fuente
fuente
find and replace all
bash
siempre se envían con Microsoft Word? ;) No, solo bromeo. Sin embargo, el OP puede querer hacer esto en una máquina remota o para un lote de archivos.sed
, lo que probablemente sea un esfuerzo inútil considerando todos los interruptores y las diferencias de plataforma.Respuestas:
Cuando no necesite el poder de las expresiones regulares, no lo use. Eso está bien.
Pero, esto no es realmente una expresión regular .
sed 's|literal_pattern|replacement_string|g'
Entonces, si
/
es su problema, use|
y no necesita escapar del primero.ps: sobre los comentarios, también vea esta respuesta de Stackoverflow en Escape a string for sed search pattern .
Actualización: si estás bien con Perl, pruébalo
\Q
y de\E
esta manera,perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
RedGrittyBrick
también ha sugerido un truco similar con una sintaxis de Perl más fuerte en un comentario aquí.fuente
s|||
ys///
es que el carácter separador es diferente y que un personaje no necesita escapar. Igualmente podrías hacers###
. El verdadero problema aquí es que el OP no quiere tener que preocuparse por escapar del contenido deliteral_pattern
(que no es literal en absoluto y se interpretará como una expresión regular).1234.*aaa
con su solución que coincida mucho más de lo previsto1234\.\*aaa
?Esta es la única solución 100% segura aquí, porque:
sed
)}
char (por lo tanto, superior a una solución Perl enviada)ENV['FIND']
se usa, no$FIND
. Con$FIND
o su texto insertado en el código Ruby, puede encontrar un error de sintaxis si su cadena contiene un escape'
.fuente
export FIND='find this; export REPLACE='replace with this';
en mi escritura del golpe para queENV['FIND']
eENV['replace']
tenido los valores esperados. Estaba reemplazando algunas cadenas cifradas realmente largas en un archivo. Esto fue solo el boleto.El
replace
comando hará esto.https://linux.die.net/man/1/replace
Cambio en el lugar:
Para stdout:
Ejemplo:
El
replace
comando viene con MySQL o MariaDB.fuente
También puede usar el
\Q
mecanismo de perl para " citar (deshabilitar) metacaracteres de patrones "fuente
perl -pe 's(\Qyour */text/?goes"here")(replacement)' file
mira mi script de Perl. hace exactamente lo que necesita sin el uso implícito o explícito de la expresión regular:
https://github.com/Samer-Al-iraqi/Linux-str_replace
muy práctico ¿verdad? Tuve que aprender Perl para hacerlo. porque realmente realmente lo necesito.
fuente
Puedes hacerlo escapando de tus patrones. Me gusta esto:
Los créditos para estas soluciones van aquí: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
Nota 1: esto solo funciona para palabras clave no vacías. Las palabras clave vacías no son aceptadas por sed (
sed -e 's//replacement/'
).Nota 2: desafortunadamente, no conozco una herramienta popular que NO use regexp-s para resolver el problema. Puede escribir dicha herramienta en Rust o C, pero no está allí por defecto.
fuente
Reuní algunas otras respuestas y se me ocurrió esto:
fuente
\n
. ¿Alguna solución?Puede usar str_replace de php :
Nota: Sin embargo, aún necesitaría escapar de comillas simples
'
y comillas dobles"
.fuente
Nodo.JS equivalente de @Nowaker:
fuente
Aquí hay una forma de trabajo "casi" más.
Use vi o vim.
Cree un archivo de texto con su sustitución en él:
luego ejecute vi o vim desde la línea de comandos:
:% sno es el comando vi para buscar y reemplazar sin magia.
/ es mi separador elegido.
: x guarda y sale vi.
Debe escapar de las barras invertidas '\' la barra diagonal '/' puede reemplazarse con, por ejemplo, un signo de interrogación '?' o algo más que no está en su búsqueda o cadena de reemplazo, tubería '|' No funcionó para mí aunque.
ref: https://stackoverflow.com/questions/6254820/perform-a-non-regex-search-replace-in-vim https://vim.fandom.com/wiki/Search_without_need_to_escape_slash http://linuxcommand.org/ lc3_man_pages / vim1.html
fuente