Ich habe einen Windows-Pfad in einer Bash-Variablen als Zeichenfolge:
file='C:\Users\abcd\Downloads\testingFile.log'
Ich versuche, diesen Pfad in einen Linux-Pfad umzuwandeln, der mit beginnt /c/Users...
.
Mein Versuch
Die folgenden Arbeiten:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
Problem
Hier habe ich das für einen String gemacht, der den Dateipfad enthält. Der Grund, warum ich diese Frage stelle, ist, dass ich 20 solcher Zeichenfolgen in einem Bash-Skript in Ubuntu 16.04 konvertieren muss und jedes Mal, wenn ich dies tue, 2 Zeilen pro Konvertierung schreiben muss - das nimmt viel Platz in Anspruch!
Frage
Gibt es eine Möglichkeit, die 2 Befehle zu kombinieren
file=${file/C://c}
file=${file//\\//}
in einen Befehl?
Antworten:
Es gibt eine Möglichkeit, beide Ersetzungen gleichzeitig durchzuführen
sed
, dies ist jedoch nicht erforderlich.So würde ich dieses Problem lösen:
Wenn Sie die Ausgabe in ein Array einfügen möchten, anstatt sie zu drucken, ersetzen Sie die
echo
Zeile durch eine Zuweisung:quelle
f1
undf2
wie würde das funktionieren? Ich meine, wie kann ich dem Array die neuen Dateinamen zuweisen, indem ich die alten ersetze?Wenn es etwas ist, das Sie oft tun möchten, warum dann nicht eine kleine Shell-Funktion erstellen?
quelle
/c/Users...
- stattdessen gibt esC:\Users\...
.cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }
im Windows-Subsystem für Linux, funktioniert wie ein Zauber!Mit sed können Sie dies in einer Zeile erreichen
Beachten Sie, dass die beiden Muster dennoch getrennt bleiben müssen, da die Übereinstimmungen durch unterschiedliche Substitutionen ersetzt werden.
quelle
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
Ist diese Frage noch offen für neue Vorschläge? Wenn ja, würde Ihnen das helfen?
Oh, und falls das C in Kleinbuchstaben umgewandelt werden muss:
Zur Übersicht:
quelle
'^C'
?^
, was hier auch in einigen anderen Antworten verwendet wurde. Danke für die Antwort und die Erklärung.