我正在开发一个python结构脚本,可以简化我在不同环境中的解决方案部署。
到目前为止它运行良好,但我在脚本的末尾有一个提示,询问我是否要编辑.yml配置文件,基本上,更新我的资产版本。我手动通过内部的vim并基本上增加了这个数字:
reconnection_delay: 50
max_attempts: 500
assets_version: 5360
我怎么可能只用命令行自动执行此操作。应该使用sed或perl,但我对此并不熟悉,可以在此理解一些帮助!
由于
答案 0 :(得分:5)
perl -i.backup -pe 's{ ( \b assets_version: \s+ ) (\d+) $ }{ $1 . ( 1 + $2 ) }xmse;' your.yml
这将创建名为 your.yml.backup 的 your.yml 的副本,查找包含“assets_version:”的行并将数字增加1。 / p>
答案 1 :(得分:3)
sed没有任何内置的算术方法,所以做起来并不容易。
<强> perl的强>
除了做正确的yaml解析之外,你可能会像这样使用单行代码:
perl -anE '$, = " "; $F[1]++ if $F[0] =~ /assets_version/; say @F'
-a
开关将输入拆分为@F
数组,从而可以访问字段。
<强> SED 强>
GNU sed可以调用外部程序,所以在bc的帮助下你可以这样做:
/assets_version/ {
h # save line to hold space
s/[^:]+:\s*(.*)/echo \1 + 1 | bc/e # convert line to 'echo num + 1 | bc'
# and pass on to /bin/sh
G # append hold space to pattern space
s/([^\n]+)\n([^:]+).*/\2: \1/ # reorder to replace with incremented
# number
}'
同一行:
sed -r '/assets_version/ { h; s/[^:]+:\s*(.*)/echo \1 + 1 | bc/e; G; s/([^\n]+)\n([^:]+).*/\2: \1/ }'
如果您想知道如何使用纯sed进行操作,这里的一种方式受GNU sed手册中cat -n
示例的启发(也适用于BSD sed):
inc.sed
/assets_version/ {
h; # save for later
s/[^:]+:\s*//; # only keep number
/^9*$/ s/^/0/; # need one more number
s/.9*$/_&/; # mark what will change
# when incrementing
H; # save for later
s/^.*_//; # only keep what will
# change
y/0123456789/1234567890/; # transliterate numbers
G; # append hold space
s/([^\n]+)\n([^:]+:\s*)[^\n]+\n([^_]*).*/\2\3\1/; # reorder to get result
}
注意,这仅适用于非负整数。
使用GNU sed,运行如下:
sed -r -f inc.sed infile
BSD sed:
sed -E -f inc.sed infile
所有情况下的输出:
reconnection_delay: 50
max_attempts: 500
assets_version: 5361
答案 2 :(得分:2)
awk '/assets_version/{$NF++}1' file > tmp && mv tmp file
只查找assets_version并递增该行的最后一个字段。
答案 3 :(得分:1)
您可以使用YAML tiny(或其他模块,如:YAML :: XS,YAML :: Syck)来读取和写入YAML文件。
https://metacpan.org/pod/YAML::Tiny
use YAML::Tiny;
use Data::Dumper;
# Create a YAML file
my $yaml = YAML::Tiny->new;
#check what the content
print Dumper($yaml);
# Open the config
$yaml = YAML::Tiny->read( 'file.yml' );
# Changing data
#$yaml->[0]->{section} = { this => 'that' };
$yaml->[0]->{reconnection_delay} = 50;
$yaml->[0]->{max_attempts} = 500;
$yaml->[0]->{assets_version} = $yaml->{assets_version} + 1;
# Save the file
$yaml->write( 'file.yml' );