从CLI替换Perl多行正则表达式

时间:2015-08-01 22:47:06

标签: regex perl

我想在包含多个repos定义的文件中从命令行永久启用Linux repo。所以该文件看起来像:

[repo-first]
some config line
another config line
enabled=0
more config lines

[repo-second]
some config line
another config line
enabled=0
more config lines

我希望能够根据回购名称有选择地将'enable = 0'设置为'enable = 1'。

似乎有多种方法可以吸入文件和/或忽略行分隔符,包括-p0e,-0777,“BEGIN {undef $} ...”。到目前为止,我最好的猜测是:

perl -0777 -e -pi "BEGIN { undef $/ } s/(\[repo\-first\]\n(.*\n)*?enabled\=)0/$1\1/mg" /etc/yum.repos.d/repo-def-file

但很自然,这不起作用。想法?

2 个答案:

答案 0 :(得分:3)

使用模块会更加方便,例如Config::Tiny

use strict;
use warnings;

use Config::Tiny;

my $conf = Config::Tiny->read( 'repo-def-file' );
$conf->{'repo-first'}{enabled} = 1;
$conf->write( 'repo-def-file' );

答案 1 :(得分:1)

正如所解释的,正则表达式通常是错误的方法,但它确实具有保留文件的顺序和结构的优势

所以,如果你必须,那么这将完成工作

perl -0777 -i -pe's/\[repo-first\][^[]+enabled=\K\d+/1/' repo-def-file