2017-08-24 31 views
0

我想用模式修改二進制文件。我已經將該文件轉換爲普通的十六進制轉儲文件,其格式爲xxd(來自軟件包vim)。在純文本文件看起來像這樣(沒有尾隨僅換1號線):RegEx在將所有字符分組爲2時排除集合

$ xxd -ps file.bin | tr -d '\n' | tee out.txt 
3a0a5354... 

我想刪除匹配\x01[^\xFF]*\xFF所有模式(一個令牌開一關令牌和他們之間的一切,除了另一收盤令牌)在原始文件,但是sed不能這樣工作。

例輸入和所需的匹配:

020202020101010101feeffeefff0000... 
     ~~~~~~~~~~~~~~~~~~~~  

而且我想這樣做:

sed 's/regex//g' in.file > out.file 

現在我想匹配所有chatacters 2×2同時排除ff。有任何想法嗎?

+0

您能否提供一些示例輸入和輸出? 'xxd'(如'hd')輸出在其輸出中具有定位元數據。 「sed」在這方面不會非常好。 Perl如何? 'perl -pe's/\ xff'//^ –

+0

@AdamKatz我使用了選項'-ps'作爲xxd – iBug

+0

太棒了。我們仍然需要示例輸入和輸出來知道你想要做什麼。你似乎在尋找與字符代碼相關的匹配正則表達式[/ x01 [^ \ xFF] * \ xFF'](https://regex101.com/r/Ts0QpE/1)的模式,但是隨後你會完全描述與十六進制對有關的不同正則表達式,這可能會滿足['(?:..)*?(?!ff)(..)'](https://regex101.com/r/Ts0QpE/2)。 –

回答

0

這應該做的伎倆:

((..)|01([0-9a-e][0-9a-f]|[0-9a-f][0-9a-e])*ff)*

也就是說,我們匹配的十六進制數字對,其中第一或第二位可以是F,但不能同時使用。在周圍環境中,我們還必須一次匹配所有兩個字符,以確保我們的匹配從偶數開始。

顯然,您必須添加一些內容,才能真正從輸出中刪除內部組,這是特定於您的正則表達式引擎的。我只是在發佈之後才意識到一個簡單的s /不會。

相關問題