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

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

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

 #!/bin/bash

 FILE='\\edi3\welshch\test'

 FILEPATH="$("$FILE" | sed -e 's/\\/\//gp')"
 echo $FILEPATH

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

然而上面的脚本给了我; ./test.sh: line 10: \\edi3\welshch\test: command not found

答案1

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

您可能打算使用通过管道传递toecho "$FILE" | sed ...的内容。FILEsed

请注意,即使这是不对的,某些版本echo也会将反斜杠处理为转义字符,从而使事情变得混乱。您需要printf "%s\n" "$FILE" | sed ...它在所有 shell 中都能工作。看:为什么 printf 比 echo 更好?

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

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

#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH=${FILE//\\//}
echo "$FILEPATH"

给出输出//edi3/welshch/test

答案2

要替换单个字符,使用起来更简单tr(1)

FILE=$(echo "$FILE" | tr '\\' / )

答案3

该变量必须输出(通过 echo)到 sed。用于sed -n抑制 sed 输出。编辑sed -n-如果我们省略 sed标志则不需要p

#!/bin/bash

FILE='\\edi3\welshch\test'

FILEPATH="$(echo "$FILE" | sed 's/\\/\//g')"
echo $FILEPATH

相关内容