Прямо к делу, мне интересно, как использовать grep/find/sed/awk для соответствия определенной строке (которая заканчивается номером) и увеличивать это число на 1. Ближайший я пришел, чтобы объединить a 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 script, но, тем не менее, я думал, что будет проще, чем рекурсивно перебирать каждый файл и проверять его содержимое для соответствия, а затем заменять, поскольку он просто увеличивая совпадающее число... не намного больше логики. Я просто не хочу писать ни в какие другие файлы или что-то в этом роде - он должен делать это на месте, например sed
с опцией "i".