Предполагая, что это метки даты/времени и увеличиваются в последовательности, тогда
a=($(grep -Po "(?<=^D.{13}).{13}" testfile | uniq))
for ((i=0; i<${#a[@]}; i+=1)); do
s=${a[$i]}
sed -E -i "s/(D.{13})$s/\1${s:0:7}D$(printf '%06d' $((i+1)))/g" testfile
done
Если штамп повторяется дальше по файлу, он получает новое приращение счетчика. Если вы этого не хотите, тогда uniq
должно быть sort | uniq
, которое будет применять один и тот же счетчик к одному и тому же штампу во всем файле.
Кстати, похоже, вы удалили 0 в позиции 28 в своем примере.