Нашли рабочее решение в Заменить переменные среды в файле их фактическими значениями?
(..env && eval "echo \"$(cat config.xml)\"")
Изменить :Это решение также удаляет метки "
в файлах. Это не то, что я хотел.
Поскольку дата вступления в силу предыдущей записи с тем же идентификатором считается датой окончания, вы можете сделать это с помощью стандартного sed
и шаблона N;P;D
, подобного этому:
sed '$!N;s/^\(.\{6\}\)\(.\)\(.\{10\}\)\(.*\n\1.\{11\}\).*/\1\2\3\4\3/;P;D'
Но как только вам нужно изменить дату, вам нужна утилита, которая понимает календарь наподобие GNUdate
:
date -d "2021-09-08 yesterday" +"%Y-%m-%d"
выводит 2021-09-07
. Я сомневаюсь, что многие версии date
будут работать таким образом. Но с текущими GNU date
и GNU sed
это должно работать :
sed -nE 'G
s/^(.{6})(.{11}).*\n\1.(.{10}).*/\1\2\3/p
s/\n.*//p
s/^(.{7})(.{10})/echo \1$(date -d "\2 yesterday" +"%Y-%m-%d")/e
h' fileA > fileB
Попробую объяснить:
n
для подавления вывода по умолчанию и параметр E
для расширенных регулярных выражений (только для удобства чтения)G
добавляет пробел, где мы собираемся сохранить предыдущую строку с адаптированной датой (см. ниже)s/^(.{6})(.{11}).*\n\1.(.{10})/\1\2\3/p
заменяет дату текущей строки адаптированной датой из области хранения, только если она имеет тот же идентификатор (, поэтому обратная ссылка\1
)и p
удаляет ее s/\n.*//p
просто удаляет добавленную строку, если замены не было, и p
удаляет ее s/^(.{7})(.{10})/echo \1$(date -d "\2 yesterday" +"%Y-%m-%d")/e
используйте флаг GNU sed
's e
xecute для отправки даты в утилиту date
для ее уменьшения h
сохраняет эту измененную строку для хранения пробела