У меня есть путь Windows в переменной Bash в виде строки:
file='C:\Users\abcd\Downloads\testingFile.log'
Я пытаюсь преобразовать этот путь в путь Linux, начиная с /c/Users...
.
Моя попытка
Следующие работы:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
проблема
Здесь я сделал это для строки, содержащей путь к файлу. Причина, по которой я задаю этот вопрос, заключается в том, что мне нужно конвертировать 20 таких строк в скрипте bash в Ubuntu 16.04, и каждый раз, когда я делаю это, мне приходится писать по 2 строки на конвертацию - это занимает много места!
Вопрос
Есть ли способ объединить 2 команды
file=${file/C://c}
file=${file//\\//}
в одну команду?
Ответы:
Был бы способ сделать обе замены одновременно
sed
, но это не обязательно.Вот как бы я решил эту проблему:
Если вы хотите поместить вывод в массив вместо печати, замените
echo
строку присваиванием:источник
f1
иf2
как бы это работало? Я имею в виду, как мне переназначить новые имена файлов в массиве, заменив старые?Если это то, что вы хотите сделать много раз, то почему бы не создать небольшую функцию оболочки?
источник
/c/Users...
- вместо этого это даетC:\Users\...
.cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }
в Windows подсистему для Linux, работает как шарм!Вы сможете достичь этого в одну строку, используя sed
Обратите внимание, что эти два шаблона должны оставаться отдельными, однако совпадения заменяются различными заменами.
источник
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
Этот вопрос все еще открыт для новых предложений? Если это так, поможет ли это вам?
О, и в случае, если C должен быть приведен к нижнему регистру:
В качестве обзора:
источник
'^C'
?^
том, что здесь использовалось и в некоторых других ответах. Спасибо за ответ и объяснение.