2017-06-29 90 views
1

我瘋了,試圖遵循sed BRE(基本正則表達式)規則來替換HTML文件中非常簡單的事件。使用sed替換HTML文件中的變量文本

我想我正確地跟着the spec,但沒有一個我的嘗試工作。

我想要做的是用新的東西(我正在計算作爲我正在編寫的腳本的一部分計算)替換一個元標記的內容。基本上,meta標籤是這樣的:

<meta version="v0.103.2" />

它總是包含遵循語法,在JS的正則表達式可以被描述爲一個屬性:

/version=\"v[0-9]+\.[0-9]+\.[0-9]+\"/g

所以我已經嘗試了大量的sed命令來實現它的工作,並且它似乎不像記載的那樣工作,除非我誤解了事情。有些我已經試過命令:

我是Mac(這很重要,因爲的sed syntax changes between Unix/Linux)上,這佔了下面的命令''

 
✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i -E '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g './src/index.html' 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./src/index.html 
✗ sed -i -E s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\"whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/version=\whatever/g ./src/index.html 
✗ sed -i '' s/version=\"v[:digit:]+\.[:digit:]+\.[:digit:]+/version=\whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:]+\.[:digit:]+\.[:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]+/whatever/g ./src/index.html 
✗ sed -i '' s/v[:digit:][:punct:][:digit:][:digit:][:digit:][:punct:][:digit:]/whatever/g ./src/index.html 
✗ sed -i '' s/v[0-9]+\.[0-9]+.[0-9]+/whatever/g ./src/index.html 
✗ sed -i '' s/version=\"[^ \"]+\"/whatever/g ./src/index.html 
✗ sed -i '' s/version="[^ "]+"/whatever/g ./src/index.html 
✗ sed -i '' s/version=\"[^\"]+\"/whatever/g ./src/index.html 
✗ sed -i '' s/version=/whatever=/g ./src/index.html 
✗ sed -i '' s/version=\"/whatever=\'/g ./src/index.html 
✗ sed -i '' s/version=\"[^\"]/whatever=\"/g ./src/index.html 

幫助?它正確找到文件。當我嘗試使用不包含正則表達式的版本(請參閱底部的第三個版本)時,它會正確替換,但不知何故,我的正則表達式語法在這裏似乎不起作用。

或者任何人都可以想到一個更簡單/更可靠的方法來做到這一點?

+1

嘗試'sed的-i' 「S /版= \」 V [0-9] * \。[ 0-9] * \。[0-9] * \「/ whatever =/g」。/ src/index.html' –

+0

@WiktorStribiżew - 工作正常!想讓它成爲答案,以便我可以選擇它? – Sasha

回答

2

您需要引用的正則表達式,而不是+和(即視爲文字+由BRE POSIX)使用任一*(匹配或更多次)或\{1,\}範圍量詞(在BRE POSIX,所述{n,m}必須寫爲\{m,n\})匹配1個或多個匹配項。

因此,你可以使用

sed -i '' "s/version=\"v[0-9]*\.[0-9]*\.[0-9]*\"/whatever=/g" ./src/index.html 

單引號:

sed -i '' 's/version="v[0-9]*\.[0-9]*\.[0-9]*"/whatever=/g' ./src/index.html 
+2

爲什麼用雙引號引號和雙引號轉義?可以只使用單引號,不需要轉義雙引號? –

+0

@ BenjaminW:是的,我們可以,你不是第一個告訴我的人,而不是第一次,甚至第二次。我主要使用C#編程,並且非常習慣於無法使用單引號定義的C#字符串文字。最近我開始使用Linux,'grep','sed'等。 –