在使用sed将Windows路径和Unix路径进行转换时,双斜杠会丢失。

3
这个命令几乎满足了我的需求:-
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的基础知识后(非常感谢所有指出这一点的人)。我也应该更清楚地说明这个问题的最终目标。

我想在脚本中使用它,并在顶部定义Windows路径。
如何将路径输出到临时文件以供sed使用?
这显然行不通:

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

如果我没看错的话,你正在使用反引号。请使用单引号。 - kurumi
哎呀,这里有个打字错误,我已经改正了。我的脚本可以正常工作,但是我不太喜欢临时文件!但从长远来看也无所谓。 - Ian Vaughan
1
你为什么需要一个临时文件呢? SOURCE_PATH=$(echo $WIN_PATH | sed 's_\\_/_g' | sed 's_ _\\ _g') - kurumi
4个回答

4

echo中使用单引号而不是双引号- 因为shell会将两个反斜杠解释为转义序列\

$ 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

使用单引号可以抑制shell扩展(例如变量),并禁用大多数转义序列。


2

您的问题在于\\已经是\的转义序列,因此您已经丢失了echo中的一个\。 您可以尝试直接使用:

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

查看它。

您需要转义那些 \ 以使其正常工作,即:

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

1
Bash使用\(反斜杠)作为转义字符。它不是被sed所吞噬,而是在将字符串传递给echo之前被bash处理。尝试:
echo "\\123"

您将获得:

\123

为了解决您的问题,请将文本放入文件中,并从文件中读取,以避免Shell转义:
$ 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

非常感谢,我已经更新了我的问题,因为我没有完全描述我的最终目标! - Ian Vaughan

1

如果你想这样做,使用单引号,这样斜杠就不会被解释。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接