如何使用sed命令将变量值括在单引号中

时间:2017-07-26 15:32:38

标签: json sed csh single-quotes

我像这样设置了env变量

setenv ENV {"a":{"b":"http://c","d":"http://e"}}

我像这样使用sed

sed 's|(ENV)|('"$ENV"')|' aFile

用以下

替换(ENV)
(a:b:http://c a:d:http://e)

但是如果我在单引号

中设置这样的变量
setenv ENV '{"a":{"b":"http://c","d":"http://e"}}'

它取代了这个

({"a":{"b":"http://c","d":"http://e"}})

但我希望(ENV)的sed输出为

('{"a":{"b":"http://c","d":"http://e"}}')

1 个答案:

答案 0 :(得分:1)

首先,引用(或转义)变量定义(使用setenv)非常重要,如this answer中所述,因为大括号和双引号(等等)是metacharacters in C shell

您可以使用单引号引用完整值

$ setenv ABC '{"a":{"b":"http://c","d":"http://e"}}'
$ echo "$ABC"
{"a":{"b":"http://c","d":"http://e"}}

或者,使用反斜杠转义元字符,如下所示:

$ setenv ABC \{\"a\":\{\"b\":\"http://c\",\"d\":\"http://e\"\}\}
$ echo "$ABC"
{"a":{"b":"http://c","d":"http://e"}}

现在,针对您问题的 sed部分 - 以及如何在替换时引用变量。

只需在sed替换表达式中添加单引号即可:

$ setenv ABC '{"a":{"b":"http://c","d":"http://e"}}'
$ echo '(ABC)' | sed 's|(ABC)|('"'$ABC'"')|'
('{"a":{"b":"http://c","d":"http://e"}}')

另请注意,您还应该处理转义sed替换元字符(仅限这三个:\/和{{1在你的变量中。你似乎意识到了这一点,因为你已经在你的正则表达式中使用&作为分隔符,但如果你不确定你的变量包含什么,那么逃避它就总是好的。有关|中可靠的转义元字符的详细信息,请参阅this answer。简而言之,要逃避单行替换模式,请运行sed