Как найти и заменить строку путем увеличения ее числовой части?

Мой входной файл,

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

но я получил outputfile как ami21ami65ami67ami66ami88ami76ami29ami55ami54ami32

т.е. все строки записаны в той же строке и без пространства. Мог любой suggext меня некоторая лучшая командная строка.

3
задан 24 February 2015 в 14:04

3 ответа

Могло бы быть легче использовать 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
5
ответ дан 1 December 2019 в 13:17

Кроме превосходного ответа, предоставленного "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)
2
ответ дан 1 December 2019 в 13:17

Другое решение для 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
1
ответ дан 1 December 2019 в 13:17

Другие вопросы по тегам:

Похожие вопросы: