Tengo una ruta de Windows en una variable bash como una cadena:
file='C:\Users\abcd\Downloads\testingFile.log'
Estoy tratando de convertir esta ruta en una ruta de Linux a partir de /c/Users...
.
Mi intento
Los siguientes trabajos:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
Problema
Aquí, he hecho esto para una cadena que contiene la ruta del archivo. La razón por la que hago esta pregunta es que tengo que convertir 20 cadenas de este tipo en un script bash en Ubuntu 16.04 y cada vez que hago esto tengo que escribir 2 líneas por conversión, ¡ocupa mucho espacio!
Pregunta
¿Hay alguna manera de combinar los 2 comandos?
file=${file/C://c}
file=${file//\\//}
en un comando?
Respuestas:
Habría una forma de hacer ambos reemplazos a la vez
sed
, pero no es necesario.Así es como resolvería este problema:
Si desea colocar el resultado en una matriz en lugar de imprimir, reemplace la
echo
línea con una asignación:fuente
f1
yf2
, ¿cómo funcionaría? Quiero decir, ¿cómo puedo reasignar los nuevos nombres de archivo a la matriz reemplazando los antiguos?Si es algo que desea hacer muchas veces, ¿por qué no crear una pequeña función de shell?
fuente
/c/Users...
, sino darC:\Users\...
.cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }
en el subsistema de Windows para Linux, ¡funciona de maravilla!Podrías lograr esto en una línea usando sed
Tenga en cuenta que los dos patrones deben permanecer separados, ya que las coincidencias se reemplazan por sustituciones diferentes.
fuente
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
¿Esta pregunta aún está abierta a nuevas sugerencias? Si es así, ¿esto te ayudaría?
Ah, y en caso de que la C se convierta en minúsculas:
Como resumen:
fuente
'^C'
?^
eso, también se ha utilizado en algunas otras respuestas aquí. Gracias por la respuesta y la explicación.