部署脚本需要更新配置文件中的整数

时间:2012-12-13 11:12:18

标签: perl unix command-line sed

我正在开发一个python结构脚本,可以简化我在不同环境中的解决方案部署。

到目前为止它运行良好,但我在脚本的末尾有一个提示,询问我是否要编辑.yml配置文件,基本上,更新我的资产版本。我手动通过内部的vim并基本上增加了这个数字:

  reconnection_delay: 50
  max_attempts: 500
  assets_version: 5360

我怎么可能只用命令行自动执行此操作。应该使用sed或perl,但我对此并不熟悉,可以在此理解一些帮助!

由于

4 个答案:

答案 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' );