行の一部を16進数に変換

行の一部を16進数に変換

次のファイルがあります。

some line
some other line
DisplayChoices=SAMSUNG
yet another line
ChipManufacturer=LG
and yet another line

(ファイルにはより多くの行があるかもしれませんが、シンボルは=一意であり、操作を実行したい行にのみ表示されます。)

次の文字列を16進表現に変換する必要があるため、=最終的には次のようになります。

some line
some other line
DisplayChoices=53,41,4D,53 (etcetera, hex representation, seperated by comma`s)
yet another line
ChipManufacturer=4C,47
and yet another line

sedとodを試してみましたが役に立ちませんでした。odファイル全体が処理されましたが、指定された文字列のみを変換するだけです。誰もが解決策を知っていますか?

答え1

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

この部分は改善することができると信じています...

答え2

バイトを16進数に変換するように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

答え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

これはフィールド区切り文字として使用され、=2番目のフィールドがある場合はこれをod -A n -t x1実行してすべてのスペースを圧縮し、先頭と末尾のスペースを切り取り、残りのすべてのスペースをコンマに変換します。

関連情報