преобразовать часть строки в шестнадцатеричный

В Debian 9 есть файловая система на основе FUSE -jmtpfs, упакованная с тем же именем. По крайней мере, с Android 8 он работает достаточно хорошо. Возможно, он доступен в виде пакета и для Mint?

Поскольку это настоящая файловая система FUSE, ее можно монтировать и использовать из командной строки.

Исходный код и введение разработчика в jmtpfsнаходятся здесь .

0
24.01.2020, 00:50
3 ответа

Вероятно, это не самый чистый способ, но с помощьюawk:

awk -F= -v OFS=\= '$2 != ""{
        "printf "$2" | od -A n -t x1 | tr -s \" \"" | getline $2;
        gsub(/^ | $/,"",$2);
        gsub(/\s/, ",",$2);
}1' input

Это будет использовать =в качестве разделителя полей, и если второе поле существует, оно выполнит для него od -A n -t x1, сократит все пробелы, обрежет начальный и конечный пробелы и преобразует все оставшиеся пробелы в запятую.

1
28.01.2020, 02:14

Вы можете избежать вызовов внешних процессов, настроив массив awk для перевода байтов в шестнадцатеричный формат:

AWK='''
BEGIN {
    FS = "="; OFS = "=";
    for (j = 0; j < 256; j++)
        Hx[sprintf("%c",j)] = sprintf(",%.2X", j);
}
function toHex (tx, Local, j, r) {
    for (j = 1; j <= length (tx); j++)
        r = r Hx[substr(tx, j, 1)];
    return (substr(r, 2));
}
$2 != "" { $2 = toHex( $2); }
{ print; }
'''
awk "${AWK}" myFile

paul--)  awk "${AWK}"  foo.txt
some line
some other line
DisplayChoices=53,41,4D,53,55,4E,47
yet another line
ChipManufacturer=4C,47
and yet another line
ESC,%,TAB,*=1B,25,09,2A
2
28.01.2020, 02:14

Если Perl является опцией:

$ perl -lpe 's#(?<==)(.*)#join ",", unpack("H2" x length($1), $1)#e' file
some line
some other line
DisplayChoices=53,41,4d,53,55,4e,47
yet another line
ChipManufacturer=4c,47
and yet another line

Я уверен, что это можно улучшить...

3
28.01.2020, 02:14

Теги

Похожие вопросы