Вы можете сделать это, используя Perl
, как показано:
Вход:
$ cat file
Location|1111|222222|333333|Doe|John|19900723|19900724|19900725
$ perl -lpe 's#\|\K([0-9]{8})(?=(?:(?:\|[0-9]{8}){0,2})$)#join "/", unpack "A4A2A2", $1#ge' file
Location|1111|222222|333333|Doe|John|1990/07/23|1990/07/24|1990/07/25
Пояснение:
-l
устанавливает RS = ORS = "\n" -p
читает входной файл в записи с установленным выше разделителем записей. Кроме того, выводит текущую запись на стандартный вывод перед чтением следующей. -e
применяет код Perl
, следующий за этой опцией, к каждой считываемой записи ($_
). regex
находит 8-значные -числа, которым предшествует вертикальная черта и за которыми следуют не более двух соседей того же сорта, что и он сам, прежде чем он увидит конец строки. Они хранятся в захваченном виде в $1
. $1
распаковывается в соответствии с шаблоном A4A2A2
, а затем эти шаблоны соединяются косой чертой. Альтернативный:
$ perl -F'[|]' -pale '$_ = join "/", unpack "A4A2A2" for @F[-3..-1]; $_ = join "|", @F'
Вы очень близко. Удалите скобки, и все должно работать:
$ date +%Y%m%d -d "(2020-06-24)+1 days"
20200702
$ date +%Y%m%d -d "2020-06-24 +1 days"
20200625
Или, точнее
dt=20200614; # or 2020-06-14, either way works
file=$(date +"XYZ.ABC.M.%Y%m%d180200.batch" -d "$dt + 1 days");
echo $file;
XYZ.ABC.M.20200615180200.batch