Perl / Awk / Sed - 查找和替换数字&自动递增

时间:2014-05-15 22:16:30

标签: perl bash awk sed

我正在寻找一个perl/awk/sed命令来自动增加第7列中的数字 文件knownfile.txt中的示例行:

该文件具有格式和7列。

today is a great day and it
is also an amazing day tomorrow now
blahblah foo today build number is 5928

我想保留所有格式,只需将5928替换为5929并保存文件

我试过了:

awk '/blahblah/{ $7++; print $0 }' filename > tmp && mv tmp filename

它会增加数字,我认为它会保留格式,但它只会将编辑过的行打印到文件中。

5 个答案:

答案 0 :(得分:7)

$ cat file
today is a great day and it
is also an amazing day tomorrow now
blahblah    foo   today     build number is     5928

$ awk '{sub(/[[:digit:]]+$/,$NF+1)}1' file
today is a great day and it
is also an amazing day tomorrow now
blahblah    foo   today     build number is     5929

如果那样做不符合您的要求,那么请认真考虑您要发布的样本输入和预期输出,以及我们必须继续发布的所有内容。

答案 1 :(得分:6)

使用perl one-liner

perl -i -pe 's/(\d+)$/1+$1/e' knownfile.txt

答案 2 :(得分:0)

鉴于该数字始终位于该行的末尾,您可以在awk中执行此操作:

awk '/foo/{++$NF}1' file

其中file是您要操作的文件。当行包含单词“foo”时,这只会增加最后一列的值。最后的1表示执行默认操作,即打印该行。

要在文件上“就地”执行此操作,您必须跳过几个环节:

awk '/foo/{++$NF}1' file > tmp && mv tmp file

较新版本的gawk支持就地编辑,但这可以在任何地方使用。

答案 3 :(得分:0)

$ perl -i -pe 's/\d+$/$&+($&>0)/e if /foo/' knownfile.txt

不会将-32视为否定。

答案 4 :(得分:-1)

此脚本没有缺点。

use Fcntl;
my $fh;
open $fh,"+<$ARGV[0]";
while(<$fh>) {
    if (/foo/) {
        s/(-?\d+)/(($1 > 0) ? ($1+1) : $1)/ge;
    }
    $file .= $_;
}
seek($fh, 0, SEEK_SET);
print $fh $file;
close $fh;