在窗口和unix路径之间转换sed损失双斜线

时间:2011-04-12 08:48:49

标签: windows linux bash path sed

这个命令几乎给了我我想要的东西: -

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路径 我如何echo sed的tmp文件路径?
这显然不会起作用: -

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

4 个答案:

答案 0 :(得分: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扩展(例如变量)并禁用大多数转义序列。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:1)

如果您想这样做,请使用单引号,以便不会解释斜杠。

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