Вы можете использовать группы из 12, 32 и 16 символов (12 + 32 = 44, 44 + 16 = 60):
sed 's/\(.\{12\}\)\(.\{32\}\)\(.\{16\}\)/\1;\2;\3/'
Ваш пример ввода не содержит 60 символов (49, если я правильно подсчитал) . В противном случае, используя только 12 и 32:
$ sed 's/\(.\{12\}\)\(.\{32\}\)/\1;\2;/' input
2015021DUMMY;001EAN1377689456777678945GERDE00;02345
2015031DUMMY;002EAN1345647876867867867TURTR01;54565
... что может быть, а может и не быть тем, что вы хотели.
Обычно группы состоят из символов x, y-x и z-y-x.
Или вы можете использовать три отдельные замены:
sed 's/.\{12\}/&;/; s/.\{45\}/&;/; s/.\{62\}/&;/'
В этом случае длины будут x, y + 1 (для точки с запятой, вставленной вместо x) и z + 2.
Неясно, чего именно вы хотите добиться, но что-то вроде этого может сработать:
Edit1 :улучшено благодаря комментарию Гленна
Edit2 :завершил код внутри цикла
input="/tmp/files/extract.txt"
while read _ id _ ip; do # iterate over the lines
echo -n "Pinging $id @ ip $ip... "
if ping -w 1 $ip 2>&1 >/dev/null; then
echo OK
else
echo NOPE
fi
done < "$input"
(bash -единственная версия, awk может быть более эффективным, но я с ним не знаком)