Rutas de tuberías con diferentes types de citas para la sustitución de barras

Me gustaría usar sed para convertir una ruta con barras invertidas en la misma ruta con barras diagonales:

Por ejemplo, me gustaría conectar \\path\to\file\ y get /path/to/file

Ninguno de los siguientes commands funciona, y no puedo decir por qué:

Primer bash:

 > echo '\\path\to\file\' | sed 's/\\/\//g' /path o ile/ 

Segundo bash:

 echo \\path\to\file\ | sed 's/\\/\//g' /pathtofile 

Tercer bash:

  echo "\\path\to\file\" | sed 's/\\/\//g' dbquote> 

Obtengo un comportamiento similar si bash conectarme a | tr '\' '/' | tr '\' '/'

Estoy buscando la respuesta correcta y, si es posible, una explicación de por qué ninguno de los bashs anteriores funcionó. No estoy seguro de si importa, pero esto es todo en zsh 4.2.6 (x86_64-networkinghat-linux-gnu)

¡Gracias!

 file='\\path\to\file\' printf '%s\n' "$file" | tr -s '\\' / 

zsh:

 setopt extendedglob print -r -- ${file//\\##/\/} 

No use el echo El problema con el echo es que hay demasiadas versiones y cada una maneja las barras invertidas de forma ligeramente diferente. La tuya evidentemente está interpretando las barras invertidas en tu string original. Si acabas de hacer

 # first attempt echo '\\path\to\file\' 

Sospecho que verías

 \path o ile\ 

De manera similar, en todos sus otros bashs, el problema es con su uso de echo y las interacciones entre echo y cotizaciones de caparazón y barras diagonales inversas, y no con la segunda parte de la tubería ( sed o tr ).

La solución es usar printf en su lugar; su comportamiento es mucho más uniforme y portátil ya que POSIX lo especifica .

 printf '\\\\path\\to\\file\\\n' 

te lleva

 \\path\to\file\ 

Puede usar el POSIX henetworkingoc para hacer esto:

 % sed -e 's@\\@/@g' -e 's@\(.\):\(.*\)@/drive/\1\2@' <<'_EOF_' > c:\some\stupid\windows\place > _EOF_ /drive/c/some/stupid/windows/place 

Mi respuesta a ¿Hay alguna manera de get arguments de shell no interpretados en una function describe esto con más detalle, incluyendo cómo read dinámicamente en una variable de shell mediante la sustitución de commands si es necesario y pasarlo como argumento a una function de shell.

En mi respuesta a Citar en ssh $ host $ FOO y ssh $ host "sudo su usuario -c $ FOO" construcciones de tipo Propongo un medio quizás diferente y, como creo, más directo de resolver un problema que de otro modo excelente respuesta.

EDITAR: Lo siento, pero originalmente pasé por alto tu request de " una explicación de por qué ninguno de [tus] bashs [de hacer una cita con las barras diagonales inversas como se ilustra en tu pregunta] funcionó: "

El truco para comprender la respuesta, aunque en realidad no es muy misterioso en sí mismo, es desafortunadamente bastante poco intuitivo. La principal barrera que generalmente encontramos en esta línea, o, al less, lo que hago, es que el shell es nuestra interfaz pnetworkingeterminada para la computadora. Como tal, creo que a veces puede ser difícil recordar que es solo un progtwig; es solo una aplicación como cualquier otra.

Podría ser un poco más fácil ver si cambia el nombre de las cosas un poco; no lo llames " shell ", pero intenta llamarlo el " command interpreter " (aunque el command interpreter probablemente también estaría bien si la palabra tendiera a henetworkingar less connotaciones jerárquicas y su significado base se destacara un poco mejor) .

Me resulta más fácil atribuir less control al shell de lo que podría haber hecho cuando, en cambio, solo se trata de mi interpreter . También es más fácil para mí recordar que cuando está involucrado no solo me interpreta a mí, sino que también, fiel a su propósito y por su propia naturaleza, trata de intermediar a cualquier conversación a la que tenga acceso; si se le da la oportunidad, el shell interpreta los datos de otras aplicaciones pasados ​​uno al otro, ya sea que lo necesite o no.

Lo que quiero decir es que el command interpreter forma natural, por defecto, toda la información que se le transmite en su propio idioma, pero su lenguaje no es necesariamente más correcto en sí mismo que el de cualquier otra aplicación. Por supuesto, es beneficioso que otras aplicaciones hablen bien el lenguaje del command interpreter , lo que les ahorrará la molestia de interpretarlo usted mismo, pero tienen tanto derecho a probar como a hacer, ya que todos son solo progtwigs informáticos. en el final.

Para complicar las cosas para sus aplicaciones hermanas, no hay una sola forma correcta o incorrecta de interpretar los commands. Lo más cercano a la corrección de Unix (y, por tanto, podría decirse que no) es probablemente el estándar POSIX, pero sin duda deja espacio para interpretar la interpretación (fue divertido decirlo y, como espero, debería ilustrar mi punto de vista). ) El resultado es un tipo de lenguaje digital análogo a muchos dialectos de un idioma análogo humano (también divertido) .

(La mayor parte de lo anterior es solo una introducción, y es probablemente al less un poco innecesario para comprender completamente lo siguiente, pero espero que ayude).

Cuando pasamos un command al shell itera sobre una list de reglas que está progtwigdo para considerar en un cierto order para interpretar nuestro command antes de pasar su interpretación de nuestro command según lo que ha interpretado que pensamos que debería ser. Nuestro principal medio para influir sobre qué reglas y en qué order las considera (distintas del command en sí, por supuesto) son diferentes types de shell quotes , entre las que se incluye comúnmente, como ha encontrado, el carácter \ backslash.

Otras aplicaciones tienen casi la misma causa y el mismo derecho a aplicar sus propios sets de reglas interpretativas, pero es poco probable que tengan la oportunidad antes de que el shell haga, y por lo general sus reglas se modelarán después de las del shell . Esto puede complicarse cuando adoptan la misma mecánica de cotización que el shell , porque nos deja la responsabilidad (jeje) de \'"quote our quotes"\' . Esta complicación se puede magnificar de forma frustrante cuando el shell y nuestra aplicación de destino difieren muy poco en la syntax de las citas, y debemos abordarlos indirectamente mediante instrucciones minuciosamente tediosas para que no se pierda nada en la traducción.

Mi medio preferido para manejar tales situaciones, como lo demostré en mi bloque de códigos anterior, es simplemente instruir directamente al shell dónde colocarlo, por así decirlo, y que debería ignorar casi todo, desde <<'HERE' porque Creo que puedo manejar esta conversación solo, muchas gracias, y me aseguraré de hacerle saber \nHERE\n cuándo debería comenzar a prestar atención nuevamente.

En bash , el primer bash funciona como un amuleto. Depende de qué echo es y qué versión está ejecutando. Por ejemplo, echo es un bash incorporado y anula el /bin/echo o /usr/bin/echo . Compruebe man bash e info zsh para comparar qué opciones aceptan y cuáles son las pnetworkingeterminadas.

Lo que realmente quiere es forzar echo -E que desactiva la interpretación de la secuencia de escape. Está pnetworkingeterminado en bash pero aparentemente no en zsh . También puede desactivar esta function incorporada en particular (no estoy usando zsh así que no sé cómo), o usar la forma más común de manejar esto: llame a echo explícitamente como /bin/echo .

Editar: por supuesto, necesitas comillas simples, de lo contrario el intérprete interpretará las secuencias de escape antes de que el echo tenga una oportunidad.