Если значения уже находятся внутри оболочки и являются шестнадцатеричными числами:
$ set -- 30 1 508 A0EA A0EB A0EC A0ED
$ for var; do printf '%04X\n' "0x$var"; done
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
Если значения строки могут быть любой строкой (, даже длиннее 4 символов ), а line
содержит значение (s )строки, решение усложняется:
[ "${#line}" -lt 4 ] &&
printf '%0*d%s\n' "$((4-${#line}))" 0 "$line" ||
printf '%s\n' "${line}"
напечатает значение с таким количеством нулей, которое необходимо для длины строки в 4 символа.
Затем для внешнего файла (решения sed и awk работают быстрее для внешних файлов ), создайте цикл и расширьте код, чтобы сделать его более разборчивым, как:
while read -r line; do
if [ "${#line}" -lt 4 ]; then
printf '%0*d%s\n' "$((4-${#line}))" 0 "$line"
else
printf '%s\n' "${line}"
fi
done <file