행의 일부를 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

이는 필드 구분 기호로 사용되며 =두 번째 필드가 있는 경우 이를 od -A n -t x1수행하여 모든 공백을 압축하고 선행 및 후행 공백을 자르고 나머지 모든 공백을 쉼표로 변환합니다.

관련 정보