2012-04-09 149 views
3

假設我有很多行的文本文件,其中之一是這樣的:SED正則表達式替換

<property name="HTTP_PORT" value="8080"></property> 

,我想它的sed改成這樣:

<property name="HTTP_PORT" value="80"></property> 

如何我會去那麼做嗎?我已經嘗試了一些東西,包括這些:

sed 's/^\(.+\)value=\"8080\"\(.+\)$/\1value=\"80\"\2/g' config.xml 
sed 's/^\(.+\)value="8080"\(.+\)$/\1value="80"\2/g' config.xml 
sed 's/^\(.+\)8080(.+\)$/\180\2/g' config.xml 
sed 's/^\(.+\)\"8080\"\(.+\)$/\1\"80\"\2/g' config.xml 
sed 's/^\(.+\)"8080"\(.+\)$/\1"80"\2/g' config.xml 

但都無濟於事。輸入和輸出總是相同的。

+0

感謝您的答案。我會嘗試他們,並儘快接受最合適的一個。 – 2012-04-10 23:55:05

回答

1

每更正已@Kevin(謝謝!)

echo $'<property name="HTTP_PORT" value="8080"></property>'\ 
| sed 's/^\(.\+\)value=\"8080\"\(.\+\)$/\1value=\"80\"\2/g' 

正確的解決方法是逃避 '+' 加號,以實現 '1個或多個'。

編輯原來的答案(這表明一個替代的解決問題) * 所以給你使用的情況下,什麼是錯的,與傳統.*(零個或多個) *

echo $'<property name="HTTP_PORT" value="8080"></property>'\ 
| sed 's/^\(.*\)value=\"8080\"\(.*\)$/\1value=\"80\"\2/g' 

**輸出**

<property name="HTTP_PORT" value="80"></property> 

此外,+ 1爲您的搜索目標錨定'^'和'$'。我已經看到了情況(類似於你在做什麼),沒有錨會大大增加運行時間。

我希望這會有所幫助。

+1

爲了記錄,sed需要'\ +'爲「一個或多個」。 – Kevin 2012-04-09 22:53:19

+0

我很欣賞共同的努力。基本上,這個答案中的第一個代碼片段就是答案,這是我的第一次嘗試,但將@ Kevin的關於sed需要'\ +'的評論合併爲「一個或多個」。謝謝你們倆。 – 2012-05-19 07:19:51

0
$> cat text 
<property name="HTTP_PORT" value="8080"></property> 

$> sed --regexp-extended 's/(value=\")[0-9]*/\180/' text 
<property name="HTTP_PORT" value="80"></property> 
2

怎麼樣的,你想要什麼直接翻譯:

sed 's|<property name="HTTP_PORT" value="8080"></property>|<property name="HTTP_PORT" value="80"></property>|g' 

這並不是因爲「聰明」爲你我能找到一個解決方案,但因爲他們來是那麼簡單,當你正在尋找一個靜態字符串,這是你所需要的。

+0

我不是這個答案的忠實粉絲。 XML可能是正確的,但包含額外的空白。由於缺乏正則表達式,這不是一個不那麼聰明的解決方案。這只是不健壯。 (誠​​然,正則表達式解決方案也不是萬無一失,但比這更強大。)但是,謝謝。 – 2012-05-19 07:21:04

0

這可能會爲你工作:

sed -i '\|<property name="HTTP_PORT" value="8080"></property>|s/80//' config.xml 

或者是:

sed -i 's/"8080"/"80"/' config.xml