Tengo un proyecto de Visual Studio, que se desarrolla localmente. Los archivos de código deben implementarse en un servidor remoto. El único problema es que contienen URL que están codificadas.
El proyecto contiene URLS como ? Page = one . Para que el enlace sea válido en el servidor, debe ser / page / one .
Decidí reemplazar todas las URLS en mis archivos de código con sed antes de la implementación, pero estoy atascado en barras.
Sé que esta no es una solución bonita, pero es simple, me ahorraría mucho tiempo. El número total de cadenas que tengo que reemplazar es menor que 10. El número total de archivos que deben verificarse es ~ 30.
El ejemplo que describe mi situación está abajo:
Comando que estoy usando:
sed -f replace.txt < a.txt > b.txt
replace.txt que contiene todas las cadenas:
s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g
a.txt:
?page=one&
?page=two&
?page=three&
Contenido de b.txt después de ejecutar mi comando sed:
pageone
pagetwo
pagethree
Lo que quiero que b.txt contenga:
/page/one
/page/two
/page/three
Respuestas:
La forma más fácil sería utilizar un delimitador diferente en sus líneas de búsqueda / reemplazo, por ejemplo:
Puede usar cualquier carácter como delimitador que no sea parte de ninguna cadena. O bien, podría escapar con una barra invertida:
Lo cual reemplazaría
/
confoo
. Debería usar la barra invertida escapada en casos en los que no sabe qué caracteres pueden aparecer en las cadenas de reemplazo (si son variables de shell, por ejemplo).fuente
sed
el comando regex entre comillas dobles. No los usé en mi respuesta porque no estaba mostrando lased
línea de comando completa , sino solo lased
cadena de comando regex como lo había hecho el OP. Si lo coloca en un archivo, como lo hizo el OP, no necesita las comillas.sed
comando en un script de shell, es posible que se necesiten más barras inclinadas invertidas (cada barra invertida debe reducirse nuevamente).El
s
comando puede usar cualquier carácter como delimitador; cualquier personaje viene después de ques
se usa. Fui educado para usar a#
. Al igual que:fuente
Un hecho muy útil pero menos conocido sobre sed es que el
s/foo/bar/
comando familiar puede usar cualquier puntuación, no solo barras. Una alternativa común ess@foo@bar@
, a partir de la cual se hace evidente cómo resolver su problema.fuente
agregar \ antes de caracteres especiales:
etc.
fuente
s/foo\/bar/foo_bar/
funcionará, pero/foo\/bar/foo_bar/
no lo hará.En un sistema que estoy desarrollando, la cadena que se reemplazará por sed es el texto de entrada de un usuario que se almacena en una variable y se pasa a sed.
Como se señaló anteriormente en esta publicación, si la cadena contenida dentro del bloque de comando sed contiene el delimitador real utilizado por sed, entonces sed termina en un error de sintaxis. Considere el siguiente ejemplo:
Esto funciona:
Esto se rompe:
Reemplazar el delimitador predeterminado no es una solución sólida en mi caso, ya que no quería limitar al usuario la entrada de caracteres específicos utilizados por sed como delimitador (por ejemplo, "/").
Sin embargo, escapar de cualquier ocurrencia del delimitador en la cadena de entrada resolvería el problema. Considere la siguiente solución de escapar sistemáticamente del carácter delimitador en la cadena de entrada antes de analizarlo mediante sed. Tal escape se puede implementar como un reemplazo usando sed, este reemplazo es seguro incluso si la cadena de entrada contiene el delimitador, esto se debe a que la cadena de entrada no es parte del bloque de comando sed:
He convertido esto en una función para ser utilizada por varios scripts:
fuente
VALUE="01\\\/01\\\/2018"
esta línea debería funcionar para tus 3 ejemplos:
-r
ahorrar un poco de escape.prueba con tu ejemplo (a.txt):
fuente
replace.txt
debiera serfuente
Gran respuesta de Anónimo. \ resolvió mi problema cuando intenté escapar de las comillas en cadenas HTML.
Entonces, si usa sed para devolver algunas plantillas HTML (en un servidor), use una barra diagonal inversa doble en lugar de una sola:
fuente
sed
es el s TREAM ed itor , en el que se puede utilizar|
(tubería) para enviar flujos estándares (entrada y salida estándar específicamente) a travéssed
y modificarlos mediante programación sobre la marcha, por lo que es una herramienta muy útil en la filosofía de la tradición Unix; pero también puede editar archivos directamente, utilizando el-i
parámetro mencionado a continuación.Considere lo siguiente :
s/
se utiliza para s ubstitute la expresión que se encuentrafew
conasd
:/g
significa "global", lo que significa hacer esto para toda la línea. Si deja el/g
(cons/few/asd/
, siempre debe haber tres barras sin importar qué) yfew
aparece dos veces en la misma línea, solo el primerofew
se cambia aasd
:Esto es útil en algunas circunstancias, como alterar caracteres especiales al comienzo de las líneas (por ejemplo, reemplazar los símbolos mayores que algunas personas usan para citar material anterior en hilos de correo electrónico con una pestaña horizontal mientras deja una desigualdad algebraica citada más adelante en la línea intacto), pero en su ejemplo donde especifica que en cualquier
few
lugar se debe reemplazar, asegúrese de tenerlo/g
.Las siguientes dos opciones (banderas) se combinan en una sola
-ie
:-i
opción se utiliza para editar i n lugar en el archivohello.txt
.-e
opción indica el correo Xpression / comando a ejecutar, en este casos/
.Nota: es importante que utilice
-i -e
para buscar / reemplazar. Si lo hace-ie
, crea una copia de seguridad de cada archivo con la letra 'e' añadida.fuente
Una alternativa más simple es usar AWK como en esta respuesta :
awk '$0="prefix"$0' file > new_file
fuente