Конвертирование между windows и unix path с sed-потерями двойной косой чертой - PullRequest
3 голосов
/ 12 апреля 2011

Эта команда почти дает мне то, что я хочу: -

echo "\\123.123.123.123\path1\1 - path2\path3 path4\path5" | sed 's_\\_/_g' | sed 's_ _\\ _g'
/123.123.123.123/path1/1\ -\ path2/path3\ path4/path5

Но, как видно, он потерял «//» в начале!
т.е. желаемый выход: -

//123.123.123.123/path1/1\ -\ path2/path3\ path4/path5

Что мне не хватает?


Редактировать: После не тестирования основ echo (большое спасибо всем, кто указал на это). Я должен был также быть более ясным в конце игры этого вопроса.

Я хочу использовать это в сценарии и определить путь для окон вверху.
Как мне echo указать путь к tmp-файлу для sed?
Это явно не сработает: -

WIN_PATH="\\123.123.123.123\path1\1 - path2\path3 path4\path5"
UNIX_PATH=`echo $WIN_PATH | sed 's_\\_/_g' | sed 's_ _\\ _g'`

Ответы [ 4 ]

4 голосов
/ 12 апреля 2011

Используйте одинарные кавычки вместо двойных в echo - так как это оболочка интерпретирует ваши две обратные косые черты как escape-последовательность для \:

$ echo '\\123.123.123.123\path1\1 - path2\path3 path4\path5' | sed 's_\\_/_g' | sed 's_ _\\ _g'
//123.123.123.123/path1/1\ -\ path2/path3\ path4/path5

Использование одинарных кавычек подавляет расширения оболочки (например,переменные) и отключает большинство escape-последовательностей.

2 голосов
/ 12 апреля 2011

Ваша проблема в том, что в \\ уже есть спасательная защита для \, поэтому вы уже потеряли один из \ на echo.Вы можете попробовать:

echo "\\123.123.123.123\path1\1 - path2\path3 path4\path5" 

, чтобы увидеть его.

Вы должны экранировать эти \, чтобы заставить его работать, т.е.

1 голос
/ 12 апреля 2011

если вы хотите это сделать, используйте одинарные кавычки, чтобы косая черта не интерпретировалась.

echo '\\123.123.123.123\path1\1 - path2\path3 path4\path5'
1 голос
/ 12 апреля 2011

Bash использует \ (обратную косую черту) как побег.Он переходит не к sed, а к bash перед передачей строки в echo.Попробуйте:

echo "\\123"

Вы получите:

\123

Чтобы решить вашу проблему, поместите текст в файл и прочитайте его оттуда, чтобы избежать выхода из оболочки:

$ cat >file
\\123.123.123.123\path1\1 - path2\path3 path4\path5
$ cat file | sed 's_\\_/_g' | sed 's_ _\\ _g'
//123.123.123.123/path1/1\ -\ path2/path3\ path4/path5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...