Увеличьте дату в файле

Другой подход GNU awk:

result = gensub("(....)(..)(..)(..)(..)", "\\1-\\2-\\3 \\4:\\5:", 1, your_variable)
1
12.08.2014, 02:22
4 ответа

Зависит от того, насколько вам это нужно. Если все, что вам нужно, это изменить 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, а затем дату, увеличенную на один день. Это будет неудачным, если в любой строке вашего файла имеется более одного =.

1
27.01.2020, 23:38

можно использовать 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

будет увеличивать каждую дату в файле.

1
27.01.2020, 23:38

Я бы написал:

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 встречается в файле только один раз, и она находится в строке сама по себе.

0
27.01.2020, 23:38

Мои собственные dateutils предоставляют инструмент командной строки dadd, который просматривает текстовый файл и добавляет что-то к каждой найденной дате:

$ dadd -S +1d FILE
PROCESS DATE =2014-08-02
0
27.01.2020, 23:38

Теги

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