Intereting Posts
Проблемы с доступом к файлам на mp3-плеере Sansa Clip Как определить, как монтируются каталоги / файловые системы? Вопросы о Rsnapshot – разрешения пользователей, удаление и жесткие ссылки Несколько вкладок в PuTTY как установить правила ufw firewall / iptable для VPN-сервера, чтобы быть явным в разрешении определенных соединений? Модификация исходного кода приложения Странное поведение cron Удаленная синхронизация RSnapshots Запустить команду на одноименные файлы из нескольких каталогов понять выход stty -a и изменить ctrl backspace на простое backspace Как автоматически сортировать флаги параметров в руководстве? Как изменить (увеличить) количество строк на экране? Утилита буфера обмена для вставки нескольких строк по одному URL-адрес Bash Shell, построенный с переменными, отсутствует после вставки позади http: // «Читаемые человеком» размеры с ls -sh на FreeBSD

Инкремент чисел внутри строк смещением

Я хочу найти текстовый файл для таких строк.

[task0] [task1] ... [task1613] 

и увеличивать каждый на заданное смещение, в этом случае на 3640. Таким образом, в примере, который я привел выше, я бы получил следующее.

 [task3640] [task3641] ... [task5253] 

Я хочу, чтобы каждый из инкрементированных номеров в исходных позициях в целевом файле, хотя [task#] обернут вокруг номера. Использование sed :

 sed "/^\[task/s/[0-9]*\]/3640+&/" ./test.file2 

Я могу получить что-то вроде:

 [task3640+0] [task3640+1] ... [task3640+1614] 

но это не очень полезно, потому что я не знаю, как оценить выражения на месте и

Я вполне уверен, что sed не подходит для этого. Я думаю, что awk или perl будут работать лучше для этого, но я довольно неуместен в обоих из них.

Может кто-то хотя бы указать мне в правильном направлении, пожалуйста? Я потратил намного больше времени, чем я хочу это признать.

Для более детального просмотра того, что я хочу увидеть, смотрите эту страницу на pastebin .

Здесь вы можете использовать внешний вид Perl, чтобы найти раздел строки, который начинается с [task за которой следуют номера. Если это будет найдено, он будет извлекать цифры и добавлять к ним 3640.

 $ perl -p -e 's/(?<=\[task)([0-9]+)/3640+$1/e' sample.txt blah blah blah [task3641] blah blah blah blah blah [task3642] blah blah blah blah blah [task5254] blah blah 

Здесь вы идете (это изменит исходный файл):

 perl -pi -e 's/\[task\K([0-9]+)/3640+$1/e' your_file 

Вот один из способов сделать это:

 perl -pe 's/(\d+)/$1+3640/e if /^\[task.*\]/' file