Другой подход GNU awk
:
result = gensub("(....)(..)(..)(..)(..)", "\\1-\\2-\\3 \\4:\\5:", 1, your_variable)
Зависит от того, насколько вам это нужно. Если все, что вам нужно, это изменить 01
на 02
, вы можете использовать что-то вроде
sed -i 's/01/02/' file
или
perl -i -pe 's/01/02/' file
Или, чтобы быть на всякий случай, сделайте это, только если 01
находится в конце строки:
sed -i 's/01$/02/' file
perl -i -pe 's/01$/02/' file
Оба вышеприведенных решения изменят исходный файл из-за флага -i
.
Если необходимо учитывать фактические даты и, например, увеличивать 2014-02-28
до 2014-03-01
, необходимо либо использовать полноценный язык программирования, который может разобрать даты, либо поиграть с командой date
:
$ while IFS='=' read -r text date; do
echo "$text=$(date -d "$date + 1 day" +%F)";
done < file > new_file
Вышеуказанное разбивает строки ввода на =
, сохраняя часть перед =
как $text
, а оставшуюся часть как $date
. Затем $date
подается на команду date
, которая может выполнять фантастические манипуляции с датой, например, добавить день, а затем распечатать его в нужном вам формате (в данном случае, формат %F
, что означает Year-Month-Day
). Обратите внимание, что это предполагает дату GNU.
Команда echo
распечатывает содержимое $text
, а затем дату, увеличенную на один день. Это будет неудачным, если в любой строке вашего файла имеется более одного =
.
можно использовать perl
:
perl -MTime::Piece -pi -e 's/\d{4}-\d\d-\d\d/
(Time::Piece->strptime($&,"%Y-%m-%d")+24*60*60)->date/ge' file
будет увеличивать каждую дату в файле.
Я бы написал:
increment_date() {
local current=$(grep -oP 'PROCESS DATE =\K.+' file)
local next=$(date -d "$current + 1 day" +%F)
sed -i "/PROCESS DATE =/s/$current/$next/" file
}
cat file
increment_date
cat file
increment_date
cat file
PROCESS DATE =2012-02-28
PROCESS DATE =2012-02-29
PROCESS DATE =2012-03-01
Это предполагает, что строка PROCESS DATE встречается в файле только один раз, и она находится в строке сама по себе.