2014-01-13 102 views
1

我有一個哈希文件的格式如下:SED替換特定字符串的結尾文件

SHA1(disk.iso)= 43798473890473280573920473902472083947320 

我需要用新的哈希以取代舊的哈希值。

我一直在試圖改變一些舊代碼,沒有運氣:

sed -i 's/SHA1(disk.iso)"[^+]*"/"'" $HASH"'"/' manifest 

這裏有什麼想法?

* UPDATE *

上面列出的刺痛是正確的:

SHA1(disk.iso)=(這裏一些SHA1哈希注意等號後的空間。)

這裏是當前的代碼:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/" manifest 

但仍然沒有。這不會修改有問題的線路。

*解*

這個工程:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/" manifest 

我只是文件名錯誤。謝謝Janos

+0

這是整個文件,或文件中只有一條線路? – Floris

+0

否其他文件有幾條相似的行。 – Atomiklan

+0

所以'SHA1(disk.iso)'是你需要的搜索字符串? – Floris

回答

2

在這裏你去:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/" manifest 

即:

  • 捕獲內\(...\)的文件名和行的其餘部分與.*
  • 匹配替換模式(全線)與捕獲的文件名\1,並追加$HASH
  • 整個事情雙引號,以便擴展shell變量。

這裏的另一個變化做同樣的事情:

sed -i "/^SHA1(disk.iso)/ s/=.*/= $HASH/" manifest 

即:

  • 對於開始SHA1(disk.iso)
  • 線更換=標誌和之後的所有= $HASH
+0

嗯,這似乎接近我想要做的,但它不能取代任何東西? – Atomiklan

+0

實際上,文件名是固定的,腳本只是反覆運行,散列值不斷變化。 – Atomiklan

+0

如果我刪除一半散列並運行腳本,當我重新打開清單文件時,沒有任何更改。我刪除了一半散列值,以便立即對文件進行明顯更改。這模擬了不同的散列存在。換句話說,該行對清單文件沒有任何作用。 – Atomiklan

1

你的正則表達式似乎很奇怪。 您用於很多引號。

你可以這樣做(如果你現在的哈希值):

sed -i "s/$OLDHASH/$NEWHASH" manifest 

如果你不認識他們,只是想用SHA1(disk.iso)更換任何線, 你可以這樣寫:

sed -i "s/\(SHA1(disk.iso)=\).*/\1 $HASH/" 

\(\)這裏的意思是反向引用;這意味着您將行保存在寄存器中,稍後將使用\1。當然,你可以直接寫:

sed -i "s/SHA1(disk.iso)=.*/SHA1(disk.iso) $HASH/" 

但在這種情況下,這將是不可能寫類似磁盤[123] .ISO 來一次匹配多個ISO文件。

+0

它不能基於哈希進行搜索,因爲該哈希值不被記住。它需要根據文件進行搜索,然後替換相應的哈希,但是謝謝。 – Atomiklan

1

兩個步驟:

  1. 找到合適的線
  2. 用新的號

通常你

cat myHashFile.txt | sed '/SHA1(disk.iso)/ {s/\d+/'$HASH'/}' > newHashFile.txt 

中的第一項要這樣做替換該行數/.../一般採取正則表達式「適用於滿足此條件的行後面」

{..}第二部分是命令:

s  substitute 
\d any digit 
\d+ one or more digits (greedy) 
$HASH replace with the contents of the $HASH variable