J'ai un chemin Windows dans une variable bash sous forme de chaîne:
file='C:\Users\abcd\Downloads\testingFile.log'
J'essaie de convertir ce chemin en un chemin Linux commençant par /c/Users...
.
Ma tentative
Les oeuvres suivantes:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
Problème
Ici, je l'ai fait pour une chaîne qui contient le chemin de fichier. La raison pour laquelle je pose cette question est que je dois convertir 20 chaînes de ce type dans un script bash dans Ubuntu 16.04 et chaque fois que je fais cela, je dois écrire 2 lignes par conversion - cela prend beaucoup de place!
Question
Existe-t-il un moyen de combiner les 2 commandes
file=${file/C://c}
file=${file//\\//}
en une seule commande?
Réponses:
Il y aurait un moyen de faire les deux remplacements à la fois en utilisant
sed
, mais ce n'est pas nécessaire.Voici comment je résoudrais ce problème:
Si vous souhaitez placer la sortie dans un tableau au lieu d'imprimer, remplacez la
echo
ligne par une affectation:la source
f1
etf2
comment cela fonctionnerait-il? Je veux dire, comment puis-je réattribuer les nouveaux noms de fichiers au tableau en remplaçant les anciens?Si c'est quelque chose que vous voulez faire plusieurs fois, alors pourquoi ne pas créer une petite fonction shell?
la source
/c/Users...
- au lieu de cela, il donneC:\Users\...
.cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }
dans le sous-système Windows pour Linux, fonctionne comme un charme!Vous seriez en mesure de réaliser cela en une seule ligne en utilisant sed
Notez que les deux modèles doivent néanmoins rester séparés car les correspondances sont remplacées par des substitutions différentes.
la source
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
Cette question est-elle toujours ouverte à de nouvelles suggestions? Si oui, cela vous aiderait-il?
Oh, et au cas où le C doit être converti en minuscules:
En résumé:
la source
'^C'
?^
ce qui a été utilisé dans d'autres réponses ici aussi. Merci pour la réponse et l'explication.