Оболочка: преобразование любого числа в текстовом файле из десятичного в шестнадцатеричный

В несколько отличном вопросе от другое, я хочу преобразовать любое число в текстовом файле из десятичного в шестнадцатеричное.

Число здесь определяется a set of numeric characters together.

Пример:

$ cat MyFile.txt
Hello,10,Good255Bye-boys01

Должен стать:

Hello,0A,GoodFFBye-boys01

Также действует:

Hello,A,GoodFFBye-boys1

Предпочтение отдается методам, которые позволяют (первый случай) указывать широкий символ (чтобы получить 0A вместо A).

Я протестировал grep для извлечения чисел, переданных в bc, для их преобразования:

( echo "obase=16" ; cat Line.txt  |grep -o '[0-9]*') | bc

но этот метод показывает только одно (преобразованное в шестнадцатеричное) число в каждой строке и удаляет остальные символы.


person Sopalajo de Arrierez    schedule 25.10.2015    source источник
comment
Баш не лучший выбор. Вам нужно что-то с лучшими возможностями регулярных выражений. Например, это тривиально в Python с re.sub.   -  person 4ae1e1    schedule 26.10.2015
comment
На самом деле, глядя на этот предыдущий вопрос, мне интересно, почему вы не приняли ни один из ответов, поскольку они, похоже, делают именно то, что вы просили. Пока вы приняли ответы только на 6 из 37 ваших вопросов.   -  person Jongware    schedule 26.10.2015
comment
@Jongware: ответам на другой вопрос всего несколько минут. Обычно я даю людям несколько недель, чтобы они предложили новые вопросы. Некоторые люди думают, что пометка как принятая помогает сообществу, но я предпочитаю подождать, чтобы быть уверенным. Как вы могли видеть, я беспокою сообщество, например, отвечая на свои вопросы, когда нашел решение; пример здесь: stackoverflow.com/questions/30563471/ . Еще один недостаток: мне очень не нравится снимать принятый знак любого вопроса.   -  person Sopalajo de Arrierez    schedule 26.10.2015
comment
Поскольку вы не обратили внимания на мой комментарий, я фактически написал код для вас. Выбирайте правильный инструмент для правильной работы.   -  person 4ae1e1    schedule 26.10.2015
comment
Попытка опубликована, @AvinashRaj. Это немного. Я думал, что ссылку на вопрос о происхождении можно рассматривать как попытку. Наверное 4ae1e1 прав и Bash не лучший инструмент для этого, так что я совсем растерялся и без идей.   -  person Sopalajo de Arrierez    schedule 26.10.2015
comment
@ 4ae1e1: Я не думаю, что кто-то, пишущий код для оригинального плаката, соответствует духу сайтов StackExchange. Я показал свои попытки и происхождение вопроса, вы написали решение, и в результате появился вики-документ, полезный для тех, кто прибывает сюда в поисках того же самого.   -  person Sopalajo de Arrierez    schedule 26.10.2015
comment
Проблема в том, что ваша попытка просто слишком далека от вашей цели, и вы ничего не добьетесь, если пойдете по этому пути.   -  person 4ae1e1    schedule 26.10.2015
comment
@ 4ae1e1: Python и Perl считаются допустимыми ответами на любой вопрос, связанный с оболочкой Linux, по крайней мере, я видел это до сих пор. Я не знаю почему. Возможно, из-за его интеграции с операционной системой. Возможно, стоит определить такие детали в правилах. Между тем, принятие Python и Perl кажется мне конструктивным способом создания форума.   -  person Sopalajo de Arrierez    schedule 26.10.2015
comment
SO заключается в том, чтобы указывать людям правильное направление, а не исполнять каждое желание идти из пункта А в пункт Б, когда пункт Б находится дальше от пункта назначения.   -  person 4ae1e1    schedule 26.10.2015
comment
Кроме того, grep и bc являются внешними командами. Они не более родные для оболочки, чем Python или Perl. Вы, конечно, можете решить эту проблему в чистом bash, но, как я уже сказал, вы должны использовать правильный инструмент для правильной работы.   -  person 4ae1e1    schedule 26.10.2015


Ответы (3)


Поскольку вы согласны с использованием grep и bc в конвейере, ясно, что вам не нужно решение в чистом sh, но вы с удовольствием используете внешние инструменты.

perl -pe 's/([0-9]+)/sprintf "%02X", $1/ge' myfile.txt
person William Pursell    schedule 26.10.2015
comment
Действительно, Perl-решение вполне допустимо, поскольку оно является обычным инструментом для оболочек Linux. Ваш вроде нормально работает. Спасибо. - person Sopalajo de Arrierez; 26.10.2015

Решение Python (благодаря предложению пользователя 4ae1e1):

$ cat convert.py
#!/usr/bin/env python3

import fileinput
import re

for line in fileinput.input():
    print(re.sub("\d+", lambda matchobj: "%X" % int(matchobj.group(0)), line), end="")

Пример использования:

cat MyFile.txt | ./convert.py

or:

./convert.py MyFile.txt
person Sopalajo de Arrierez    schedule 26.10.2015

Команда dec2hex выполнит эту задачу.

person manoj b    schedule 26.10.2015