【发布时间】:2020-01-23 15:48:59
【问题描述】:
我想创建一个包含动态凭据的配置文件模板。副本应保留结构,但将值替换为空字符串(即“”)。为此,我使用awk。
awk -v dq="\"" '{ if($NF ~ /^[&|\*|\n]/ || $1 == $NF) print $0; else {$NF=""; print $0 dq dq;} }' .config.yaml >> .config_temp.yaml
问题出在 else 语句中。当我设置$NF="" 时,不再打印前导空格。如果我没有将最后一个字段设置为空字符串,我不会观察到这种行为,但显然不会收到预期的输出(见下文)。
如何在保留前导空格的同时将最后一个字段设置为空字符串?
我不想手动添加许多空格,因为意图不同。
config.yaml(输入)
DEVELOPMENT: &development
<<: *common
check_access_token: False
database:
mongodb:
database: test
hostname: localhost
port: 27017
username: ""
password: ""
collection:
col_1: test_1
col_2: test_2
col_3: test_3
col_4: test_4
conf_temp.yaml(实际输出)
DEVELOPMENT: &development
<<: *common
check_access_token: ""
database:
mongodb:
database: ""
hostname: ""
port: ""
username: ""
password: ""
collection:
property: ""
ctrl_voc: ""
form: ""
user: ""
预期输出
DEVELOPMENT: &development
<<: *common
check_access_token: ""
database:
mongodb:
database: ""
hostname: ""
port: ""
username: ""
password: ""
collection:
property: ""
ctrl_voc: ""
form: ""
user: ""
编辑(在 Sundeep 重播之后)
感谢您的回答。它几乎按我的预期工作。但是,我没有收到与您相同的输出。如果我打电话
awk -F'[ ]' -v dq="\"" 'NF>1 && $NF !~ /^[*&]|:$/{$NF = dq dq} 1' .conf.yaml
我收到以下输出:
DEVELOPMENT: &development
<<: *common
check_access_token: ""
"" <--
"" <--
database: ""
hostname: ""
port: ""
username: ""
password: ""
"" <--
property: ""
ctrl_voc: ""
form: ""
user: ""
缩进符合预期,但上层的键被引号替换(见箭头)。
如果我将您的第二个建议与 sed 一起使用,我会收到相同的输出。
【问题讨论】: