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

how to use sed command to enclose a variable value in single quotes

我这样设置环境变量

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"}}')

首先,在定义时引用(或转义)您的变量(使用 setenv)很重要,如 , since braces and double quotes (among others) are 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 替换元字符 (仅这三个:\/ , 和 &) 在你的变量中。您似乎意识到了这一点,因为您已经在正则表达式中使用 | 作为定界符,但是如果您不确定变量包含什么,最好将其转义。有关 sed 中可靠的转义元字符的详细信息,请参阅 。简而言之,要转义单行替换模式,运行 通过 sed 's/[&/\]/\&/g'.