#bash #shell #hex
Вопрос:
Допустим, у меня есть файл, следующий этому шаблону
112;167;82 16;104;2 24;163;3 67;195;48
Я хочу, чтобы каждое число было преобразовано в шестнадцатеричное.
70;A7;52 10;68;02 18;A3;03 43;C3;30
printf '%xn'
работает, но только для одного экземпляра сразу.
Ответ №1:
while IFS=';' read -a n ; do printf 'X;' "${n[@]}" echo done lt; file | sed 's/;$//'
read -a
считывает каждую строку в массив, установкаIFS
устанавливает разделитель, т. е. элементами массива будут числа в каждой строке;- В
printf
строке выводится каждый элемент массива , за которым следует a;
, после чего вsed
команде удаляется конечная точка с запятой. echo
добавляет новую строку в конце каждого печатного массива.
Комментарии:
1. Большое спасибо. Мне пришлось немного подшутить, чтобы добавить 0 перед единичными случаями, но это работает идеально.
2. @M-Rick: Просто используйте
X
шаблон, чтобы добавить начальные нули.
Ответ №2:
удар:
while IFS=';' read -ra line; do line=$(printf '%x;' "${line[@]}") echo "${line%;}" done lt; file
awk (вероятно, быстрее для файла большего размера):
awk ' BEGIN {FS=OFS=";"} {for (i=1; ilt;NF; i ) { $i = sprintf ("%x", $i) } print}' my-file
Ответ №3:
awk -F ';' '{print toupper(sprintf("x;x;x",$1,$2,$3))}' file
Выход:
70;A7;52 10;68;02 18;A3;03 43;C3;30
Ответ №4:
С помощью sed
$ sed 's/;/ /g;s/.*/printf "x" amp; /e;s/[a-z0-9]{2}/Uamp;;/2;s/[a-z0-9]{2}/Uamp;;/' input_file
Для того, чтобы printf
команда запустилась, ;
ее необходимо удалить, после чего printf "x"
можно будет выполнить.
Выход
70;A7;52 10;68;02 18;A3;03 43;C3;30
Комментарии:
1. Спасибо, я упрощаю свои трюки, добавляю ноль перед единичными случаями.
Ответ №5:
Поскольку хорошие ответы с bash, awk, sed уже опубликованы, как насчет perl
решения (хотя perl не включен в теги):
perl -pe 's/d /sprintf("X", $amp;)/ge' file
-pe
Опция указывает perl обрабатывать входные данные строка за строкой и автоматически печатать выходные данные.s/../../
Оператор выполняет подстановку какsed
.- Регулярное выражение
d
соответствует последовательности цифр. - Переменная
$amp;
содержит соответствующую подстроку. g
Опция дляs
оператора позволяет выполнять глобальную замену какsed
.- Последний
e
вариант оценивает правую сторону как выражение perl.