正则表达式从括号中提取数字,修改,然后替换原始数字

时间:2016-08-01 19:23:33

标签: regex

尝试提取括号(AA)之间的数字并修改(例如乘以300)并使用全文中的新值(AA * 300)更新旧值(AA)。

示例输入:

RRRR TTTTYYY (6600);
UUUUUUU IIIIII4 (16500);

预期产出:

+

3 个答案:

答案 0 :(得分:0)

gawk救援!

$ awk '{print $1,$2,"("300*gensub(/\((.*)\);/,"\\1",1,$3)");"}' file   

RRRR TTTTYYY (6600);
UUUUUUU IIIIII4 (16500);

条件基于括号中的值

$ awk '{v=gensub(/\((.*)\);/,"\\1",1,$NF); if(int(v)==v) $NF="("(300*v)");"}1' file

RRRR TTTTYYY (6600);
UUUUUUU IIIIII4 (16500);
ZZZ FFF (2,3);

我将最后一行添加到输入文件中。

也许这是一个更好的解决方案,只限制整数匹配

$ awk '{if(match($NF,/\([0-9]+\)/)) 
            $NF="(" 300*substr($NF,RSTART+1,RLENGTH-2) ");"}1' file

RRRR TTTTYYY (6600);
UUUUUUU IIIIII4 (16500);
ZZZ FFF (2,3);

答案 1 :(得分:0)

在Perl中,程序上:

my $str = 'RRRR  TTTTYYY (22)';
my $num = $1 if $str =~ /\((\d+)\)/;
my $result = $num * 300;
$str =~ s/$num/$res/; 
print $str;

功能:

sub x {
    my $str = @_;
    my $num = $1 if $str =~ /\((\d+)\)/;
    my $result = $num * 300;
    $str =~ s/$num/$res/; 
    return $str;
}

print x('RRRR  TTTTYYY (22)');

作为单行,其中file.txt每行包含一个字符串

perl -lne '$num = $1 if $_ =~ /\((\d+)\)/; $res = $num * 300; $_ =~ s/$num/$res/; print' file.txt

答案 2 :(得分:0)

如果字符串中的唯一数字是括号内的数字,那么在Perl中这很简单:

$ perl -pE 's/(\d+?)/300*$1/eg' your_input_file.txt
RRR  TTTTYYY (6600);
UUUUUUU IIIIII1200 (16500);

如果你需要检查括号,那就更难了

$ perl -pE 's/(?<=\()(\d+?)(?=\))/300*$1/eg' your_input_file.txt
RRR  TTTTYYY (6600);
UUUUUUU IIIIII4 (16500);