私の入力ファイルは、
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
:ファイルを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
別の何かを試してみたい場合は、「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)
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