我有一个像
这样的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
现在,我想要测试环境的数据库值(对于显示的YAML是sample
)。
我们怎样才能用sed做到这一点?
答案 0 :(得分:11)
这很容易,不是使用sed
,而是使用适当的shell工具。首先,如果您需要在变量中保留sample
以供日后使用,那么以下内容将使用bash substring replacement 来隔离{strong>测试中的sample
:/ database:行:
$ 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
中,这只是一个问题你宁愿用。我想你明白了。
答案 1 :(得分:5)
比sed
更好的工具。您可能会停留在最小的系统上,但其他人寻找答案可能不会
$ pip install yq
$ yq -r .test.database database.yml
sample
shyaml也可以使用,但是有一个奇怪的限制,即您只能重定向到它:
$ pip install shyaml
$ shyaml get-value test.database < database.yml
sample
如果perl
在附近并且您已安装YAML:
$ cpan YAML
$ perl -MYAML -le 'print YAML::LoadFile(shift)->{test}{database}' database.yml
sample
或者,如果您想要ruby
:
$ ruby -r yaml -e 'puts YAML.load_file(ARGV[0])["test"]["database"]' database.yml
sample
答案 2 :(得分:3)
YAML显然在shell中本身不受支持。但是sed也不是YAML解析器。也不是grep,tail,cut等。我很确定你需要一个真正的语言来编写一个合适的解析器。 awk,perl,python,erlang等。
如果你知道你的YAML数据总是以某种方式格式化或按特定顺序保存某些值,你可以使用sed或shell或者某些东西,但是要创建一个通常 的解析器>,以及任何ol&#39;您指向的YAML文件,您需要模拟已经存在于其他语言中的解析器。
如果您不想编写自己的代码(可能需要考虑一些代码后请求StackOverflow社区寻求帮助),那么一个选项可能是安装shyaml这样的工具,它可以准确无误解析文件并为您提供权威内容。虽然它有一些依赖项(python),但很容易在脚本中实现快速解决方案。
答案 3 :(得分:3)
在Ubuntu上: 安装yq
$ sudo apt update
$ sudo apt install snapd
$ sudo snap install yq
使用yq
$ value=$(yq r database.yml test.database)
答案 4 :(得分:1)
对于使用 Homebrew 的 macOS / Linux 用户,可以使用 yq
,并提供类似 jq
的体验:
$ brew install yq
$ yq eval .test.database database.yml
sample