带有大括号和双引号值的 sed 命令失败
sed command failure with curly braces and double quotes values
我有一个包含以下内容的文件
(ABC)
我使用以下命令创建了一个环境变量
setenv ABC {"a":{"b":"http://c","d":"http://e"}}
然后我运行 sed 命令
sed 's|(ABC)|('"$ABC"')|' myFile
这个return与这个
a:b:http://c a:d:http://e
实际上应该return这个
{"a":{"b":"http://c","d":"http://e"}
关于我遗漏的任何想法
从 braces and double quotes are metacharacters in C shell 开始,您必须使用反斜杠对它们进行转义,如下所示:
setenv 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"}}
相反,如果您不转义或引用 setenv
语句中的值,就像您在问题中所做的那样,您将得到:
$ echo "$ABC"
a:b:http://c a:d:http://e
这就是您得到的结果(sed
与问题无关)。
我有一个包含以下内容的文件
(ABC)
我使用以下命令创建了一个环境变量
setenv ABC {"a":{"b":"http://c","d":"http://e"}}
然后我运行 sed 命令
sed 's|(ABC)|('"$ABC"')|' myFile
这个return与这个
a:b:http://c a:d:http://e
实际上应该return这个
{"a":{"b":"http://c","d":"http://e"}
关于我遗漏的任何想法
从 braces and double quotes are metacharacters in C shell 开始,您必须使用反斜杠对它们进行转义,如下所示:
setenv 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"}}
相反,如果您不转义或引用 setenv
语句中的值,就像您在问题中所做的那样,您将得到:
$ echo "$ABC"
a:b:http://c a:d:http://e
这就是您得到的结果(sed
与问题无关)。