我像这样设置了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"}}')
答案 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
。