Как найти / заменить и увеличить совпадающее число с помощью sed / awk?

Прямо к делу, мне интересно, как использовать grep / find / sed / awk для сопоставления с определенной строкой (которая заканчивается цифрой) и увеличить это число на 1. Самое близкое, что я получил, - это объединить 1 в конец (который работает достаточно хорошо), потому что главное - просто изменить значение. Вот что я сейчас делаю:

find . -type f | xargs sed -i 's/\(\?cache_version\=[0-9]\+\)/\11/g'

Так как я не мог понять, как увеличить число, я захватил все это и просто добавил «1». Раньше у меня было что-то вроде этого:

find . -type f | xargs sed -i 's/\?cache_version\=\([0-9]\+\)/?cache_version=\11/g'

По крайней мере, я понимаю, как захватить то, что мне нужно.

Вместо того, чтобы объяснять, для чего это, я просто объясню, что я хочу, чтобы он делал. Он должен найти текст в любом файле, рекурсивно, основываясь на текущем каталоге (это не важно, это может быть любой каталог, поэтому я настрою это позже), который сопоставляет «? Cache_version =» с числом. Затем он увеличит это число и заменит его в файле.

В настоящее время все, что у меня есть, работает, просто я не могу увеличить найденное число в конце. Было бы лучше иметь возможность увеличивать вместо добавления «1», чтобы будущие значения не были «11», «111», «1111», «11111» и т. Д.

Я просмотрел десятки статей / объяснений, и достаточно часто, предложение использоватьawk, но я не могу за свою жизнь смешать их. Наиболее близким я пришел к использованиюawk, который на самом деле ничего не заменяет, это:

grep -Pro '(?<=\?cache_version=)[0-9]+' . | awk -F: '{ print "match is", $2+1 }'

Мне интересно, есть ли какой-нибудь способsed в конце и передайте оригинальное имя файла, чтобыsed может иметь имя файла и увеличенный номер (изawk) или что там нужноxargs есть.

Технически это число не имеет значения; эта замена в основном для того, чтобы убедиться, что там есть новый номер, который на 100% точно отличается от предыдущего. Поэтому, когда я писал этот вопрос, я понял, что с таким же успехом могу использовать системное время - секунды (метод, часто используемый AJAX для устранения кеширования для последующих «идентичных» запросов). Я закончил с этим, и это кажется идеальным:

CXREPLACETIME=`date +%s`; find . -type f | xargs sed -i "s/\(\?cache_version\=\)[0-9]\+/\1$CXREPLACETIME/g"

(Сначала я сохраняю значение, чтобы все файлы получали одно и то же значение, в случае если по какой-либо причине оно охватывает несколько секунд)

Но я все равно хотел бы знать исходный вопрос о приращении совпадающего числа. Я предполагаю, что простым решением было бы сделать его сценарием bash, но, тем не менее, я подумал, что будет более простой способ, чем рекурсивно перебирать каждый файл и проверять его содержимое на соответствие, а затем заменять, так как он просто увеличивает совпадающее число ... не так уж много логики. Я просто не хочу писать в любые другие файлы или что-то в этом роде - он должен делать это на месте, напримерsed делает с опцией "я".

Ответы на вопрос(3)

Ваш ответ на вопрос