Как преобразовать путь dir  Windows (скажем c:/libs/Qt-static) к правильному пути  POSIX (/c/libs/Qt-static) с помощью стандартного  msys. И наоборот?
Преобразование PATH в POSH в posix в bash
Ответ 1
Я не знаю msys, но быстрый поиск в Google показал мне, что он включает утилиту sed. Итак, если он работает аналогично в msys, чем в родной Linux, вот один из способов, как это сделать:
От Windows до POSIX
Вам нужно будет заменить все обратные косые черты косой чертой, удалите первый двоеточие после буквы диска и добавьте косую черту в начале:
echo "/$pth" | sed 's/\\/\//g' | sed 's/://'
или, как отмечено xaizek,
echo "/$pth" | sed -e 's/\\/\//g' -e 's/://'
От POSIX до Windows
Вам нужно будет добавить полуточку, удалить первую косую черту и заменить все слэши на обратную косую черту:
echo "$pth" | sed 's/^\///' | sed 's/\//\\/g' | sed 's/^./\0:/'
или более эффективно,
echo "$pth" | sed -e 's/^\///' -e 's/\//\\/g' -e 's/^./\0:/'
где $pth - переменная, хранящая путь Windows или POSIX, соответственно.
Ответ 2
Используете ли вы его на cygwin? Если да, то в пакете cygwin есть готовая утилита с именем cygpath.exe для этого.
Output type options: -d, --dos print DOS (short) form of NAMEs (C:\PROGRA~1\) -m, --mixed like --windows, but with regular slashes (C:/WINNT) -M, --mode report on mode of file (binmode or textmode) -u, --unix (default) print Unix form of NAMEs (/cygdrive/c/winnt) -w, --windows print Windows form of NAMEs (C:\WINNT) -t, --type TYPE print TYPE form: 'dos', 'mixed', 'unix', or 'windows'
Ответ 3
Вот моя реализация (проверено на git bash).
Из POSIX в Windows
sed '
    \,/$, !s,$,/,
    \,^/, s,/,:/,2
    s,^/,,
    s,/,\\,g
    ' <<< "[email protected]"
Работает на:
/c/git
relative/dir
c:/git
~
.
..
/c
/c/
./relative/dir
/sd0/some/dir/
Кроме
/
<path with space>
Объяснение:
 \,^/, s,/,:/,2 (конвертирует /drive/dir/ в /drive: /dir/) - это сердце и вставляет : перед 2 м /. Я использую , для delim вместо / для удобочитаемости. Если начать с / (\,^/,), то заменить / на :/ для 2 вхождения. Я не хочу считать, что длина буквы диска равна 1, так что это работает для /sd0/some/dir.
 s,^/, удаляет ведущие / а s,/,\\,g преобразует все / в \.
 \,/$, !s,$,/, должен обработать угловой регистр /c и обеспечить 2 / (/c/) для следующей команды для работы.
Замечания:
 Если здесь строка <<< не работает в вашей оболочке, вы можете echo и передать как
echo "[email protected]" | sed ...
описки
Здесь электронный сценарий
