Mam ścieżkę systemu Windows w zmiennej bash jako ciąg:
file='C:\Users\abcd\Downloads\testingFile.log'
Próbuję przekonwertować tę ścieżkę na ścieżkę Linuksa zaczynając od /c/Users...
.
Moja próba
Następujące prace:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
Problem
Tutaj zrobiłem to dla ciągu zawierającego ścieżkę do pliku. Powodem, dla którego zadaję to pytanie, jest to, że muszę przekonwertować 20 takich ciągów w skrypcie bash w Ubuntu 16.04 i za każdym razem, gdy to robię, muszę napisać 2 wiersze na konwersję - zajmuje to dużo miejsca!
Pytanie
Czy istnieje sposób na połączenie 2 poleceń
file=${file/C://c}
file=${file//\\//}
w jednym poleceniu?
Odpowiedzi:
Byłby sposób na wykonanie obu wymian jednocześnie
sed
, ale nie jest to konieczne.Oto jak rozwiązałbym ten problem:
Jeśli chcesz umieścić dane wyjściowe w tablicy zamiast drukowania, zamień
echo
wiersz na przypisanie:źródło
f1
if2
jak by to działało? To znaczy, jak mam przypisać nowe nazwy plików do tablicy, zastępując stare?Jeśli chcesz to zrobić wiele razy, to dlaczego nie stworzyć małej funkcji powłoki?
źródło
/c/Users...
- zamiast tego dajeC:\Users\...
.cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }
w podsystemie Windows dla Linuksa, działa jak urok!Byłbyś w stanie to osiągnąć w jednej linii za pomocą sed
Zauważ, że oba wzorce muszą pozostać oddzielne, ponieważ dopasowania są zastępowane przez różne podstawienia.
źródło
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
Czy to pytanie jest nadal otwarte na nowe sugestie? Jeśli tak, czy to by ci pomogło?
Aha, a jeśli C musi być rzucone na małe litery:
Jako przegląd:
źródło
'^C'
?^
to, co zostało wykorzystane w innych odpowiedziach tutaj. Dziękuję za odpowiedź i wyjaśnienie.