2011-08-25 184 views
6

我試圖用bash腳本中的sed替換HTML頁面中的一些HTML標籤的內容。出於某種原因,我沒有得到正確的結果,因爲它沒有取代任何東西。它必須是非常簡單/愚蠢的即時俯瞰的東西,任何人都在幫助我?使用sed替換HTML標籤內容

HTML搜索/替換:使用

Unlocked <span id="unlockedCount"></span>/<span id="totalCount"></span> achievements for <span id="totalPoints"></span> points. 

sed命令:

cat index.html | sed -i -e "s/\<span id\=\"unlockedCount\"\>([0-9]\{0,\})\<\/span\>/${unlockedCount}/g" index.html 

的這點是根據一些外部數據來解析HTML頁面,並更新數據。對於第一次運行,標籤的內容將是空的,之後它們將被填充。


編輯:

最後我用這導致了下面的代碼的答案的組合:

sed -i -e 's|<span id="unlockedCount">\([0-9]\{0,\}\)</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

非常感謝@Sorpigal,@tripleee,@classic爲幫助!

+0

這是一個無用的貓 – Sorpigal

+0

,但改變「貓」f.e. 「少」現在不會真的解決我的問題嗎? – Revell

+1

否,但是'sed'...'inputfile'會,並且是唯一正確的方法來執行它,如果您想使用'sed -i'。 – tripleee

回答

5

試試這個:

sed -i -e "s/\(<span id=\"unlockedCount\">\)\(<\/span>\)/\1${unlockedCount}\2/g" index.html 
+1

這將在第一次後失敗。您需要在span標籤之間匹配'[0-9] \ {0,\}'。 – Sorpigal

+0

是的,如果它應該取代範圍內的值,這需要更正 – classic

1
sed -i -e 's%<span id="unlockedCount">([0-9]*)</span\>/'"${unlockedCount}/g" index.html 

我刪除貓的無用使用,拿出了一堆不必要的反斜槓,圍繞保護它免受shell擴展正則表達式添加單引號和固定重複操作。您可能仍需要反斜槓分組括號;我的sed至少想要\(... \)。

請注意使用彼此相鄰的單引號和雙引號。單引號可以防止外殼擴展,因此您不能在「$ {unlockedCount}」周圍使用它們,而您希望外殼插入變量。

1

你說什麼,你想要做的是不是你告訴sed做。

你想插入一個數字到一個標籤或替換它,如果存在。您試圖告訴sed要做的是將span標記及其內容(如果有)或數字替換爲shell變量中的值。

你也使用了很多複雜,煩人和易出錯的轉義序列,這些都不是必需的。

這裏有你想要的東西:

sed -r -i -e 's|<span id="unlockedCount">([0-9]{0,})</span>|<span id="unlockedCount">'"${unlockedCount}"'</span>|g' index.html 

注意區別:

  • 新增-r打開擴展的表情沒有它你捕捉模式是行不通的。
  • 使用|而不是/作爲替代的分隔符,因此不需要轉義/
  • 單引號sed表達式,以便它不需要從殼體中逃脫內部的東西。
  • 在替換部分包含匹配的span標籤,以便它不會被刪除。
  • 爲了擴大unlockedCount變量,關閉了單引號表達式,然後再重新打開它。
  • 刪掉了cat |這在這裏沒用。

我也在shell變量擴展中使用了雙引號,因爲這是很好的做法,但是如果它不包含空格,這並不是真的必要。

嚴格來說,我不需要添加-r。如果您說\([0-9]\{0,\}\),普通舊sed將工作,但這裏的想法是簡化。

+0

-r似乎不是有效的sed命令?至少在Mac OS上。 – Revell

+1

在MacOS X中,啓用擴展表達式的開關將不同(可能是'-E',BSD樣式)。 '-r'是一個GNU sed開關。 – Sorpigal