Только что выучил флаг e
(для «выполнить») через несколько дней go. Похоже, отлично работает для этой проблемы. Обратите внимание, что это расширение GNU - этот трюк может не работать, возможно, на MacOS (которая основана на FreeBSD).
Вот входной файл, который я создал для тестирования:
$ cat myfile.csv
DATE,TYPE
20200310,B
20180228,B
20181215,A
20130404,A
20050228,B
А вот решение sed
и вывод:
$ cat myfile.csv | sed -E 's/^([[:digit:]]{8}),B$/echo $((\1 - 40000)),B/e'
DATE,TYPE
20160310,B
20140228,B
20181215,A
20130404,A
20010228,B
Конечно, «дата» не будет действительной датой, если вы начнете, например, с 19040229 и вычтете 4 из года ; 1904 год был високосным, а 1900 - нет. К счастью, 2000 год делится на 400, поэтому это был високосный год; с 1905 по 2103 годы у вас все будет хорошо.
Более безопасный вариант - заменить echo $((\1 - 40000)),B
на
date -d "& -4 years" +%Y%m%d,B