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 contenant le chemin du 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
Est-il possible de combiner les 2 commandes
file=${file/C://c}
file=${file//\\//}
en une seule commande?
Il serait possible de faire les deux remplacements en même temps en utilisant sed
name__, mais ce n'est pas nécessaire.
Voici comment je résoudrais ce problème:
filenames=(
'C:\Users\abcd\Downloads\testingFile.log'
# ... add more here ...
)
for f in "${filenames[@]}"; do
f="${f/C://c}"
f="${f//\\//}"
echo "$f"
done
Si vous souhaitez placer la sortie dans un tableau au lieu d'une impression, remplacez la ligne echo
par une affectation:
filenames_out+=( "$f" )
Si c'est quelque chose que vous voulez faire plusieurs fois, pourquoi ne pas créer une petite fonction Shell?
win2lin () { f="${1/C://c}"; printf '%s\n' "${f//\\//}"; }
$ file='C:\Users\abcd\Downloads\testingFile.log'
$ win2lin "$file"
/c/Users/abcd/Downloads/testingFile.log
$
$ file='C:\Users\pqrs\Documents\foobar'
$ win2lin "$file"
/c/Users/pqrs/Documents/foobar
Vous pourrez y arriver en une ligne en utilisant sed
file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\\|/|g')"
Notez que les deux modèles doivent néanmoins rester séparés car les correspondances sont remplacées par des substitutions différentes.
Cette question est-elle toujours ouverte à de nouvelles suggestions? Si oui, cela vous aiderait-il?
$ file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '\\' '/')"
$ echo $file
/C:/Users/abcd/Downloads/testingFile.log
Oh, et si le C doit être converti en minuscule:
file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '^C' 'c'|tr '\\' '/')"
En guise d'aperçu:
$ file='C:\Users\abcd\Downloads\testingFile.log'
$ echo $file
C:\Users\abcd\Downloads\testingFile.log
$ file="/$(echo $file|tr '^C' 'c'|tr '\\' '/')"
$ echo $file
/c:/Users/abcd/Downloads/testingFile.log