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

我的输入文件是,

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

即所有字符串都写在同一行,没有空格。 任何人都可以给我一些更好的命令行。

为此可能更容易使用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 

除了“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) 

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

 $ 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