web-dev-qa-db-ja.com

数値部分を増やして文字列を見つけて置換する方法は?

私の入力ファイルは、

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として取得しました

つまり、すべての文字列は同じ行にスペースなしで書き込まれます。誰かが私にいくつかのより良いコマンドラインを提案してもらえますか?.

3
tamal

これにはPerlを使用する方が簡単かもしれません。

$ Perl -pe 's/(\d+)/$1+1/eg' foo
AMI22 AMI66
AMI68 AMI67
AMI89 AMI77 AMI30
AMI56 
AMI55
AMI33
  • -pe:ファイルを1行ずつループし、式の評価後に各行を出力します
  • 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
5
muru

別の何かを試してみたい場合は、「muru」が提供する優れた回答とは別に、Pythonの方法を次に示します。

#!/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)
2
heemayl

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
1
Avinash Raj