传递SED替换BASH变量中的参数

时间:2014-04-16 19:41:09

标签: bash sed

我试图将带有空格的变量传递给使用BASH的sed,并且在提示符下,它可以正常工作:

$ tmp=/folder1/This Folder Here/randomfile.abc
$ echo "$tmp" | sed -e 's/ /\\ /g'
/folder1/This\ Folder\ Here/randomfile.abc

但是一旦我将它传递给变量,sed就不再用反斜杠替换空格:

$ tmp=/folder1/This Folder Here/randomfile.abc
$ location=`echo "$tmp" | sed -e 's/ /\\ /g'`
$ echo $location
/folder1/This Folder Here/randomfile.abc

我希望第二双眼睛可以接受我不能做的事情。

3 个答案:

答案 0 :(得分:5)

你需要几对反斜杠:

sed -e 's/ /\\\\ /g'

您似乎想引用输入以便将其用作shell输入。无需使用sed。您可以使用printf

$ foo="a string with spaces"
$ printf "%q" "$foo"
a\ string\ with\ spaces

答案 1 :(得分:3)

您需要使用更多引用。

tmp="/folder1/This Folder Here/randomfile.abc"
location="$(echo "$tmp" | sed -e 's/ /\\ /g')"
echo "$location"

还有一个纯bash解决方案来插入反斜杠:

tmp="/folder1/This Folder Here/randomfile.abc"
echo "${tmp// /\\ }"

答案 2 :(得分:3)

在分配期间,bash正在评估引号。您可以通过引用来解决这个问题:

location="$(echo "$tmp" | sed -e 's/ /\\ /g')"

或devnull的答案(双引号)

或者切换到zsh以使这样的事情更容易

% echo $tmp
/folder1/This Folder Here/randomfile.abc
% echo ${(q)tmp}
/folder1/This\ Folder\ Here/randomfile.abc