Как преобразовать числа в шестнадцатеричном формате в файл по шаблону?

#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.