【问题标题】:how to use sed command to enclose a variable value in single quotes如何使用 sed 命令将变量值括在单引号中
【发布时间】:2017-07-29 03:50:39
【问题描述】:

我这样设置环境变量

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

【问题讨论】:

    标签: json sed csh single-quotes


    【解决方案1】:

    首先,如this answer 中所述,在定义时引用(或转义)变量(使用setenv)很重要,因为大括号和双引号(以及其他)是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 中可靠转义元字符的详细信息,请参阅this answer。简而言之,要避开单行替换模式,请通过 sed 's/[&/\]/\\&/g' 运行它。

    【讨论】:

    • 谢谢,但在评估后,该值仅作为单引号之间的字符串返回。我希望评估完全相同的值。连同单引号。
    • 谢谢,但我应该更清楚一点,我无法更改设置变量的方式,但是我可以在评估时使用 sed 加回引号吗?
    • .. 和 请阅读 What should I do when someone answers my question?。看来您不是 SO 的新用户,但似乎只接受您自己的答案,而不赞成其他任何答案。这不是在 SO 上表现的好方法。
    • 当然谢谢,我通常会尝试答案并接受它是否有效。假设我验证了您的答案并且对我有用,这也不好
    • 嘿,看来工作了,谢谢。对于答案和downvote大声笑
    猜你喜欢
    • 2020-07-01
    • 2022-01-08
    • 2019-06-03
    • 2013-10-09
    • 2012-06-24
    相关资源
    最近更新 更多