Perl/Awk/Sed-查找和替换编号&;自动增量

Perl/Awk/Sed-查找和替换编号&;自动增量,perl,bash,awk,sed,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 &

我正在寻找一个
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

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

此脚本没有缺点

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;
使用Fcntl;
我的$fh;

打开$fh,“+鉴于号码总是在行尾,您可以在awk中执行此操作:

awk '/foo/{++$NF}1' file
其中,
file
是要对其进行操作的文件。当该行包含单词“foo”时,这只是增加最后一列的值。末尾的
1
表示执行默认操作,即打印该行

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

awk '/foo/{++$NF}1' file > tmp && mv tmp file
较新版本的
gawk
支持就地编辑,但这在任何地方都适用

$ perl -i -pe 's/\d+$/$&+($&>0)/e if /foo/' knownfile.txt
不将
-32
视为负数。

使用perl单行程序

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

如果这不符合您的要求,那么请认真考虑您发布的样本输入和预期输出,因为这就是我们要做的。

发布更多行样本输入和预期输出,并将其格式化。数字是否总是在同一位置,即在行的末尾?汤姆,是的,我要替换的数字总是在行的末尾line.FYI您对字段执行的任何操作(如上面的$7)都将更改格式,因为更改字段会告诉awk使用OFS值(默认为单个空格)重新编译记录($0)在字段之间,因此默认情况下,所有连续空格链都将替换为一个空白字符。为了避免这种情况,您需要对整个记录进行操作,而不是对记录中的任何1个字段进行操作。与大多数语言一样,awk有一个
++
运算符,因此您可以编写
$NF++
++$NF
而不是
$NF=$NF+1
@Ed为了提高效率,我将使用预增量版本;)谢谢你指出这一点。我本来应该这样做的。事实上,很明显,当它保存数据时,它删除了一些格式,这导致了一个问题。有没有办法让行的间距/格式保持编辑状态?@user3642747它适用于examp如果您的文件不同,您应该编辑问题以使其更清楚。@user3642747当您增加这样的字段时,它将更改格式以使用默认的字段分隔符(一个空格)对于整行。查看Eds解决方案,使用
sub
,在不更改行格式的情况下更改字段。有些人可能会认为脚本有12行长,带有神秘语句是一个缺点:-)。处理我遇到的格式问题的好方法(或者如果输入不同,会遇到格式问题)。我想在块之前应该有
/foo/
。idk,我看到一些答案与/foo/匹配,但我在问题中没有看到任何提及。好的一点,这似乎不再是问题的一部分。我想我需要跟上!+1,以便保留行格式并完成摘要。我收到了
修改的消息尝试在-e第1行,第1行初始化只读值。
I通过更改为
perl-I-pe的/(\d+)$/1+$1/e'knownfile.txt
$ 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