2015-10-25 25 views
3

這是我的示例文本文件:殼牌:在文件轉換第一個字段的文本文件的從十進制爲十六進制

$ cat RealVNC\ MRU.reg 
"10"="Lamborghini-:1" 
"16"="Terminus-" 
"20"="Midnighter-:5915" 
"35"="ThreepWood-:1" 
"81"="Midnighter-:1" 
"58"="Midnighter-" 

而且我想轉換第一場值( (""之間的數字)從十進制到十六進制(它是Windows的.reg文件,所以我認爲數字是十進制數,現在文件太長而無法手動編輯)。

結果示例,我需要獲得:

$ cat Hex\ RealVNC\ MRU.reg 
"0A"="Lamborghini-:1" 
"10"="Terminus-" 
"14"="Midnighter-:5915" 
"23"="ThreepWood-:1" 
"51"="Midnighter-:1" 
"3A"="Midnighter-" 

如可以看到的,只數字已經改變。 生成的數字必須是兩個字符(RegEdit認爲它們不同)。
順序的變化在這裏不打擾,但我認爲這將是更「乾淨」的解決方案,不會改變它。

我不希望任何數量(無論是十進制或十六進制),將有超過2個字符,但認爲這種可能性將是最好的(因爲它是一個更通用的解決方案)的解決方案。

我迄今已檢測:

$ cat RealVNC\ MRU.reg | awk -F \" '{print $2}' 
10 
16 
20 
35 
81 
58 

但我不知道是誰在網上進行的更改從十二月十六進制。

我的shell通常是Bash,但也可以接受其他shell衍生的解決方案(如Perl或Python)。

+0

你解決了嗎?如果是,請將最有用的答案標記爲已接受。 – klashxx

+0

只要它不再是規則,我會用更多的時間來:a)對答案進行更多的測試。 b)更多可能的答案。 c)更多建議/更正/細節。我更願意在幾周後接受答案,而不是太快,以至於我需要糾正我的選擇。 –

回答

1

您可以使用Perl - 使用substitution operatore標誌時,你可以通過一個函數來處理替換值:

echo abc | perl -ne 's/(.+)/uc($1);print/e' # ABC 

然後可以使用sprintf function轉換小數與%X轉換爲十六進制:

%x an unsigned integer, in hexadecimal
%X like %x, but using upper-case letters

$ cat RealVNC\ MRU.reg | perl -ne 's/^"(.*?)"/sprintf("\"%X\"", $1)/e;print;' 
"A"="Lamborghini-:1" 
"10"="Terminus-" 
"14"="Midnighter-:5915" 
"23"="ThreepWood-:1" 
"51"="Midnighter-:1" 
"3A"="Midnighter-" 

如果你想在0-F單值前導零,您可以使用前綴格式%02X

%02X 
^^L Conversion 
|L Result length 
L- Prefix char 

而結果:

$ cat RealVNC\ MRU.reg | perl -ne 's/^"(.*?)"/sprintf("\"%02X\"", $1)/e;print;' 
"0A"="Lamborghini-:1" 
"10"="Terminus-" 
"14"="Midnighter-:5915" 
"23"="ThreepWood-:1" 
"51"="Midnighter-:1" 
"3A"="Midnighter-" 
+0

似乎是工作,但我在這個問題上犯了一個錯誤(現在糾正):'A'必須是'0A'(所有數字必須是2個字符長)。無論如何,你的方法似乎只能通過'{10..15}'失敗,我可以手動編輯這6個數字。謝謝。 –

+0

@SopalajodeArrierez是的,我實際上雖然當我閱讀以及..簡單地使用printf前綴樣式'%02X'(見編輯) – andlrc

3

一個簡單的awk

awk -F\" '$2=sprintf("%02X", $2)' OFS=\" file 
"0A"="Lamborghini-:1" 
"10"="Terminus-" 
"14"="Midnighter-:5915" 
"23"="ThreepWood-:1" 
"51"="Midnighter-:1" 
"3A"="Midnighter-" 

說明

  • -F\":套字段分隔符(FS)至"

  • $2=sprintf("%02X", $2)$2被分配給它的使用 字母「A印刷 版本(sprintf)與%02X掩模以十六進制'到'F'的十六進制數字大於9和兩位數字 寬度與0填充

  • OFS=\":設置Ø本安輸出FS匹配FS

$2分配總是並沒有額外的行動給出,awk始終顯示的結果,因爲它的默認操作。

+1

好的和簡單的解決方案,+1不知道'OFS' – andlrc

+1

澄清OP是在主awk腳本之外設置變量OFS:可以寫成:awk BEGIN {FS =「\」「; OFS =」\「」}; $ 2 = sprintf(「%02X」,$ 2)''。 – andlrc

相關問題