将变量传递给 sed 并将反斜杠更改为正斜杠

eek*_*nky 4 sed

我正在编写一个 bash 脚本来通过cifs. 我有主要部分工作,但是当我需要用户将 DFS 路径作为变量输入并将反斜杠转换为正斜杠时,我遇到了麻烦。

 #!/bin/bash

 FILE='\\edi3\welshch\test'

 FILEPATH="$("$FILE" | sed -e 's/\\/\//gp')"
 echo $FILEPATH
Run Code Online (Sandbox Code Playgroud)

我有另一个脚本,它使用命令来查找 AD 主目录的文件路径,然后按部分通过管道传输到 sed | sed -e 's/\\/\//gp

但是上面的这个脚本给了我; ./test.sh: line 10: \\edi3\welshch\test: command not found

ilk*_*chu 9

在您拥有的命令替换中"$FILE" | sed -e 's/\\/\//gp',shell 将其扩展为(相当于)'\\edi3\welshch\test' | sed -e 's/\\/\//gp'。由于它是一个command,shell 会寻找一个叫\\edi3\welshch\testrun的文件。

你可能想用的是echo "$FILE" | sed ...传递的内容FILE,以sed通过管道。

请注意,即使这样也不对,有些版本echo会将反斜杠处理为转义字符,从而将事情搞砸。你需要printf "%s\n" "$FILE" | sed ...它在所有 shell 中工作。请参阅:为什么 printf 比 echo 好?

另请注意, 的默认行为sed是在执行任何操作后打印该行。当您/ps///命令上使用时,它会导致额外的打印,因此您会在输出中得到两次结果。

也就是说,由于您使用的是 Bash,您可以只使用字符串替换扩展:

#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH=${FILE//\\//}
echo "$FILEPATH"
Run Code Online (Sandbox Code Playgroud)

给出输出 //edi3/welshch/test