2016-02-05 75 views
-1

enter image description here查找和替換在多行

0070 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 34 
0080 2e 30 20 28 63 6f 6d 70 61 74 69 62 6c 65 3b 20 

我試圖找到一種方式找到/匹配模式

2f 34 2e 30 20 28 63 6f 

,取而代之的是完全匹配的十六進制

2f 35 2e 30 20 28 68 63 

問題是這種模式可以用許多不同的方式分解成兩行,例如2f 34 2e 30 20可以在第一行的末尾,然後是下一行的其餘模式。我想了解如何找到替代其他(更大)的模式。

此代碼僅適用於模式完全包含在一行上的情況。

# replace hex equivalent of "/4.0 (co" with "/5.0 (hc" in hex field 
sed 's/2f 34 2e 30 20 28 63 6f/2f 35 2e 30 20 28 68 63/g' <MPFADT$var.txt >>MPFADT$new.txt" 

我已經玩過awk和sed但是無濟於事。我也看了perl的例子。

我敢肯定,我可以擺脫偏移的,但是,這需要合併打破格式化......

awk -F' ' ' {print " "$2 > file} MPFADT$var.txt 
+0

請查看[editing-help](http://stackoverflow.com/editing-help)。 – Cyrus

+0

我的回答或任何其他問題是否解決了您的問題?如果是這樣,請考慮接受它作爲您的答案 - 通過點擊投票計數旁邊的空心綠色勾號/複選標記。如果沒有,請說出什麼不起作用,以便我或其他人可以進一步幫助您。謝謝。 –

回答

0

十六進制代碼可以使用多條線路由您使用的工具印刷是產生十六進制轉儲,但原始文件中包含的十六進制字符串不會「破」成多行。我的意思是如果「2f 34 2e 30 20 28 63 6f」在某處包含一個新行......它將是一個不同的十六進制序列。

這麼說,我覺得你可以只使用SED:

$ sed 's/\x2f\x34\x2e\x30\x20\x28\x63\x6f/\x2f\x35\x2e\x30\x20\x28\x68\x63/' your_file 
0

下面是不關心的字符串你想多長時間更換,或者它有多少行拆分爲一個方法:

$ cat tst.awk 
{ 
    keys[NR] = $1 
    sub(/^[^[:space:]]+[[:space:]]+/,"") 
    buf = (NR>1 ? buf FS : "") $0 
} 
END { 
    gsub(old,new,buf) 
    for (i=1; i<length(buf); i+=(NF*3)) { 
     print keys[++nr] " " substr(buf,i,(NF*3)-1) 
    } 
} 

$ awk -v old="2f 34 2e 30 20 28 63 6f" -v new="2f 35 2e 30 20 28 68 63" -f tst.awk file 
0070 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 
0080 2e 30 20 28 68 63 6d 70 61 74 69 62 6c 65 3b 20 

它確實將整個文件讀入內存,但是,如果這是您的問題或不是。如果是的話,你可以定義buf爲最大尺寸,並通過它寫入代碼來旋轉你所有的輸入線,每次buf改變時都會執行gsub(),但這會變得更復雜和效率更低,然後你必須考慮2nd gsub()可能運行在由第一個gsub()修改的數據上,而不是原始數據上。

0

以下是一種方法。首先使用xxd明文格式轉儲文件,並且這將抑制左側的地址。現在刪除所有的換行符,以便任何東西都不能跨越多行,因爲你的文件現在是一個長行,然後讓你的替代不受懲罰,並重新編譯xxd。描述需要更長的時間!

xxd -p input.bin | tr -d '\n' | sed 's/2f342e302028636f/2f352e3020286863/g' | xxd -r -p - patched.bin 

您更好地使用GNU sed的不過因爲這對行的長度沒有限制。

0

這可能爲你工作(GNU SED):

sed -r 'N;s/2f(\n.... |)34(\n.... |)2e(\n.... |)30(\n.... |)20(\n.... |)28(\n.... |)63(\n.... |)6f/2f\135\22e\330\420\528\668\763/;P;D' file 

保持兩行的模式匹配運行窗口。由於模式可能出現在輸出的任何位置,因此可以通過在每對符號之間提供交替模式來實現此目的。

N.B.您的成功可能有限,因爲分頁可能會破壞蘋果手推車。