2016-10-10 175 views
0

我知道我可以用SED做到這一點。但在我的具體任務中,它有點複雜。所以儘管本網站有很多例子,但我仍無法弄清楚。用SED查找並替換bash腳本中的字符串

我有一個配置文件與憑據。

<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

我想將所有憑據更改爲新的唯一值。當我使用SED替換時,這是一個問題,因爲它將用戶名和數據庫名更改爲新值。

新的值應該是,例如:

newusername 
newpassword 
newdbname 

我會怎麼做呢?我曾在SED中尋找過第一次出現,但由於某種原因無法工作。

我也試圖找到並替換整個行,包括XML和CDATA區,但這使得它更復雜,因爲特殊字符。

我該如何解決這個問題?

編輯

輸出我所期待的。

<username><![CDATA[newusername]]></username> 
<password><![CDATA[newpassword]]></password> 
<dbname><![CDATA[newdbname]]></dbname> 

尋找我看到的第一個答案我沒有很清楚我想要什麼。

EDIT2

我發現這裏的完美解決方案:Sed regex change of file

+0

爲什麼-1?反饋? – Akif

+0

爲了清晰起見,您可以發佈完整的預期輸出嗎?沒有任何重疊提出任何問題,所以加入你的嘗試,以便你可以知道你錯了什麼地方......而且我也沒有倒下...... – Sundeep

+1

我沒有投票,但想知道預期的產出或投入的努力在哪裏? –

回答

1

務必:任何

sed -E 's/username|password|dbname/new&/g' file 
  • username|password|dbname比賽usernamepassworddbname

  • 在更換,new在每個匹配(&)之前perpended,並且在比賽中出現的所有的線(g

實施例完成的:

% cat file.txt 
<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

% sed -E 's/username|password|dbname/new&/g' file.txt 
<newusername><![CDATA[prefix_cms]]></newusername> 
<newpassword><![CDATA[complexpwd]]></newpassword> 
<newdbname><![CDATA[prefix_cms]]></newdbname> 

回答編輯的問題:

sed -E 's/^(<([^>]+).*\[)[^]]+(.*)/\1new\2\3/' file 

例子:

% cat file.txt 
<username><![CDATA[prefix_cms]]></username> 
<password><![CDATA[complexpwd]]></password> 
<dbname><![CDATA[prefix_cms]]></dbname> 

% sed -E 's/^(<([^>]+).*\[)[^]]+(.*)/\1new\2\3/' file.txt 
<username><![CDATA[newusername]]></username> 
<password><![CDATA[newpassword]]></password> 
<dbname><![CDATA[newdbname]]></dbname> 
+0

謝謝,我看到我並沒有完全清楚自己想要什麼,於是我編輯了預期輸出的問題。 – Akif

+0

@Akif檢查我的編輯。 – heemayl