2011-06-12 48 views
0

這裏是從原始USB轉存一行:使用SED從原始USB抽取十六進制字節傾倒

Id Type      Time  Length Hex    Ascii 

16 Out (USB URB Function: 45) 0.01513  2048  a3 e8 55 cc  correpondant ascii 

注意,編號,類型,時間,長度改變所有的時間,並且數十六進制字節是非常巨大的。

我想要做的是擦除除十六進制字節以外的所有內容。我想過使用SED來替換這是不是一對數字/ [字母從A到F]和兩個空間之間的一切:

sed -E 's/([^ ][^a-f0-9][^a-f0-9][^ ])//g' <orig >new 

但它給我說:​​

1Uun) 0.015013 2048 a3 e8 55 cc 

,只是ascii的某些部分被刪除。

我嘗試了一些基於上面的其他sed命令,但它也不起作用。

任何想法?謝謝。

回答

1

sed可能不是此工作的最佳工具。我會親自編寫一個Python或類似的解析器。

但是,如果你想抓住從終端這個使用正則表達式,或者使用grep:

% grep -o '\(\b[[:xdigit:]]\{2\}[[:space:]]\)\+' orig 
16 
a3 e8 55 cc 

注意,「16」是一個十六進制對。

+0

這幾乎完成了這項工作,我必須實施兩個sed命令才能使其工作完美無瑕。謝謝 ! – b1onic 2011-06-13 01:08:05

2

或只使用awk 'print $4'如果有分隔符。

0

或採取Johnsyweb點子1個一步,

$:> printf "16 Out (USB URB Function: 45) 0.01513  2048  a3 e8 55 cc  correpondant ascii\n" \ 
| grep -o '\(\b[[:xdigit:]]\{2\}[[:space:]]\b[[:xdigit:]]\{2\}[[:space:]]\)\+' 

產生

a3 e8 55 cc 

如果你有一個新的GNU sed的,你可以依靠,你應該能夠很容易地轉換grep的正則表達式進入sed。

AND,說明buruzaemon的切割技術

$:> printf "16 Out (USB URB Function: 45) 0.01513  2048  a3 e8 55 cc  correpondant ascii\n" \ 
| cut -c54-66 

產生

a3 e8 55 cc 

但是,假設你的ID列(還有其他人)不會改變大小。

我希望這會有所幫助。