Преобразование PATH в POSH в posix в bash
Как преобразовать путь dir Windows (скажем c:/libs/Qt-static
) к правильному пути POSIX (/c/libs/Qt-static
) с помощью стандартного msys. И наоборот?
Ответы
Ответ 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 ...
описки
Здесь электронный сценарий