我有一个database.yml文件
development: adapter: mysql2 encoding: utf8 database: d360 host: localhost username: root password: password test: adapter: mysql2 encoding: utf8 database: sample host: localhost username: root password: password
现在,我要testing环境的数据库值(即显示YAML sample
)。 我们如何使用sed来做到这一点?
这很容易,不使用sed
,而是使用适当的shell工具。 首先,如果你需要保留一个变量以备以后使用,那么类似下面的代码将使用bash 子串替换来隔离Test:/ database: line上的sample
:
$ db=$(grep -A3 'test:' database.yml | tail -n1); db=${db//*database: /}; echo "$db" sample
或者可以转储到命令行的更短的解决方案,删除变量和命令替换,并使用像cut
这样的工具:
$ grep -A3 'test:' database.yml | tail -n1 | cut -c 13- sample
或者用awk
简单地说:
$ grep -A3 'test:' database.yml | tail -n1 | awk '{ print $2}' sample
所有不同的方法都可以在命令替换 ( var=$(stuff)
)中使用,以便将sample
存储在var
,这只是您希望使用的一个问题。 我想你应该已经明白了。
YAML显然不是本地支持的shell。 但sed也不是YAML解析器。 grep,tail,cut等都不是,我敢肯定,你需要一个真正的语言来写一个合适的解析器。 awk,perl,python,erlang等
如果你知道你的YAML数据总是以某种方式格式化,或者按照特定的顺序保存某些值,那么你可以使用sed或者shell或者其他的方法,但是要创建一个通用的解析器,并且在你的YAML文件中指向它,你需要模拟其他语言中已经存在的解析器。
如果你不想写你自己的(也许一旦你有一些代码需要考虑的话,可以向StackOverflow社区寻求帮助),那么一个选项可能是安装一个像shyaml这样的工具,它可以准确地解析文件并给你权威的内容。 一个快速的解决方案很容易实现到你的脚本,虽然它有一些依赖(python)。