texto sustituir reemplazo reemplazar por palabra eliminar consola con comando cadena buscar archivos sed

sustituir - ¿Cómo reemplazar cadenas que contienen barras con sed?



reemplazo con sed (9)

El comando s puede usar cualquier carácter como delimitador; cualquier personaje viene después de que se usa la s . Me criaron para usar un # . Al igual que:

s#?page=one&#/page/one#g

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 las URL contienen y están codificadas.

El proyecto contiene URLs como ? Page = one . Para que el enlace sea válido en el servidor, debe ser / page / one .

He decidido reemplazar todas las URL 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 debo reemplazar es menor que 10. El número total de archivos que deben verificarse es ~ 30.

El ejemplo que describe mi situación está a continuación:

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


En un sistema que estoy desarrollando, la cadena que se reemplazará por sed es 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 con el error de sintaxis. Considere el siguiente ejemplo:

Esto funciona:

$ VALUE=12345 $ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g MyVar=12345

Esto rompe:

$ VALUE=12345/6 $ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g sed: -e expression #1, char 21: unknown option to `s''

Reemplazar el delimitador predeterminado no es una solución sólida en mi caso, ya que no quería limitar al usuario a ingresar 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 escape sistemático del carácter delimitador en la cadena de entrada antes de que Sed lo haya analizado. Tal escape puede implementarse como un reemplazo utilizando el propio sed, este reemplazo es seguro incluso si la cadena de entrada contiene el delimitador, esto es porque la cadena de entrada no es parte del bloque de comandos sed:

$ VALUE=$(echo ${VALUE} | sed -e "s#/#////#g") $ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g MyVar=12345/6

Lo he convertido en una función para ser utilizada por varios scripts:

escapeForwardSlashes() { # Validate parameters if [ -z "$1" ] then echo -e "Error - no parameter specified!" return 1 fi # Perform replacement echo ${1} | sed -e "s#/#////#g" return 0 }


Gran respuesta de Anonymous. Solucioné mi problema cuando traté de escapar las comillas en cadenas HTML.

Por lo tanto, si utiliza sed para devolver algunas plantillas HTML (en un servidor), use doble barra diagonal inversa en lugar de única:

var htmlTemplate = "<div style=//"color:green;//"></div>";


La manera más fácil sería usar un delimitador diferente en las líneas de búsqueda / reemplazo, por ejemplo:

s:?page=one&:pageone:g

Puede usar cualquier carácter como un delimitador que no forme parte de ninguna cadena. O bien, podrías escapar con una barra invertida.


Un hecho muy útil pero menos conocido sobre sed es que el familiar comando s/foo/bar/ puede usar cualquier puntuación, no solo barras. Una alternativa común es s@foo@bar@ , de la cual resulta obvio cómo resolver su problema.


agregar / antes de caracteres especiales

s//?page=one&/page//one///g

etc


esta línea debería funcionar para tus 3 ejemplos:

sed -r ''s#/?(page)=([^&]*)&#//1//2#g'' a.txt

  • -r para ahorrar un poco de escape.
  • la línea debe ser genérica para su caso uno, dos y tres. no tienes que hacer el sub 3 veces

prueba con tu ejemplo (a.txt):

kent$ echo "?page=one& ?page=two& ?page=three&"|sed -r ''s#/?(page)=([^&]*)&#//1//2#g'' /page/one /page/two /page/three


replace.txt debería ser

s/?page=///page///g s/&//g


sed es el s tream ed itor , en el que puedes usar | (pipe) para enviar streams estándar (STDIN y STDOUT específicamente) a través de sed y alterarlos programáticamente sobre la marcha, por lo que es una herramienta útil en la tradición de filosofía de Unix; pero también puede editar archivos directamente, usando el parámetro -i mencionado a continuación.
Considera lo siguiente :

sed -i -e ''s/few/asd/g'' hello.txt

s/ se usa para sustituir la expresión encontrada con asd :

Los pocos, los valientes.

El asd, el valiente.

/g significa "global", lo que significa hacer esto para toda la línea. Si dejas fuera el /g (con s/few/asd/ , siempre debe haber tres barras, no importa qué) y few aparecen dos veces en la misma línea, solo las primeras se cambian a asd :

Los pocos hombres, las pocas mujeres, los valientes.

Los hombres asd, las pocas mujeres, los valientes.

Esto es útil en algunas circunstancias, como alterar caracteres especiales al comienzo de las líneas (por ejemplo, reemplazar los símbolos mayores que algunos usan para citar material anterior en hilos de correo electrónico con una pestaña horizontal mientras se deja una desigualdad algebraica citada más adelante en la línea) sin tocar), pero en su ejemplo donde especifica que en algún lugar few ocurren debe ser reemplazado, asegúrese de tener ese /g .

Las siguientes dos opciones (indicadores) se combinan en una sola, es -ie :

-i opción -i se usa para editar en el archivo hello.txt .

-e opción indica el comando e xpression / para ejecutar, en este caso s/ .

Nota: es importante que use -i -e para buscar / reemplazar. Si lo hace, es -ie , crea una copia de seguridad de cada archivo con la letra ''e'' adjuntada.