Преобразование 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 ...

описки

Здесь электронный сценарий