如何通过增加字符串的数字部分来查找和替换字符串?

如何通过增加字符串的数字部分来查找和替换字符串?

我的输入文件是,

ami21 ami65
ami67 ami66
ami88 ami76 ami29
ami55 
ami54
ami32

使用单个命令行我需要输出如下内容,

ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56
ami55
ami33

我使用了命令

awk -vRS=ami '{$0=$0+1;ORS=RT}++n' inputfile > outputfile

但我得到的输出文件为ami21ami65ami67ami66ami88ami76ami29ami55ami54ami32

即所有字符串都写在同一行且没有空格。有人能给我推荐一些更好的命令行吗?

答案1

perl这样使用可能会更容易:

$ perl -pe 's/(\d+)/$1+1/eg' foo
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33
  • -pe:逐行循环遍历文件,在计算表达式后打印每一行
  • s/(\d+)/$1+1/e:匹配一个数字(\d+),并将其替换为其增量($1+1),用于e告诉 Perl 评估替换。

使用 时awk,必须在记录分隔符中包含空格:

$ awk -v RS='[[:space:]]*ami[[:space:]]*' '$0{$0++;}{ORS=RT}1' foo
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33

答案2

除了“muru”提供的出色答案之外,如果您想尝试一些不同的东西,这里还有一个 Pythonic 方法:

#!/usr/bin/env python2
import re
with open('file_name.txt') as f:
    for line in f:
        final_list = ['ami' + str(int(value) + 1) for value in re.findall('\d+', line)]
        print ' '.join(final_list)

答案3

通过另一个 python 解决方案re.sub

$ python3 -c 'import re, sys
with open(sys.argv[1]) as f:
    for line in f:
        print(re.sub(r"\d+", lambda x: str(int(x.group())+1), line), end="")' file
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33

相关内容