2013-04-12 223 views
0

我需要用sed單引號替換文本,我無法讓它工作。這是我的代碼;你可以幫我嗎?sed替換文本

我有這種格式的文本文件:

#sometext 
$configuration_TEstbk2_bk2_environment12 = 'lalala' 
$configuration_TEstbk2_bk2_envoronment12 = 'lalala1' 
$configuration_TEstbk2_bk2_staging12 = 'BACKUP 2' 
$configuration_waq4faw4f_q4fq4qg4f = 'r234rq43rq4rqr' 
$configuration_alice_StagingTEstBk_bk = 'testebk' 
$configuration_deployment_overlays_alice_TEStStngDir = 'some' 
$configuration_arefgqrqgrq_341q34tq34t = '134t135' 

,我需要做一些事情,如:

sed s/$configuration_arefgqrqgrq_341q34tq34t ='134t135'/$configuration_arefgqrqgrq_341q34tq34t = 'NEWVALUE'/g 

我已經嘗試了很多組合,帶sed,但我不能找到一個這樣可行。

+1

你不認爲它會可能更對我們有用的顯示輸出您要考慮到輸入,而不是一個腳本不起作用,讓我們猜測你想要一個腳本是做什麼的? –

回答

1

這會幫你嗎?

sed "/\$config_deployment_overlays_alice_arefgqrqgrq_341q34tq34t_staging/s/'134t135'/'NEWVALUE'/" file 
+0

非常感謝,這對我有效! – user2275908

+1

@ user2275908很高興爲您提供幫助。請考慮[接受答案](http://meta.stackexchange.com/a/5235/181223)。 –

0

我可能會使用:

sed '/$configuration_arefgqrqgrq_341q34tq34t *=/'"s/'134t135'/'NEWVALUE'/" 

它使用單引號和雙引號的混合在外殼的水平,以獲得正確的信息,sed。單引號包含$configuration_arefgqrqgrq_341q34tq34t後面跟着一些空格和等號的行的搜索條件。這可以避免shell擴展可能是shell變量名的東西(但可能不是,所以空字符串會被替換)。然後,我在shell級別切換到雙引號,以便sed可以看到單引號:它將單引號中的值替換爲替換值,但僅限於包含給定配置參數名稱的那些行。

我希望用戶永遠不必輸入這些配置參數名稱。

0

我想你的問題是與報價。你可以使用複雜的報價,以確保一切都在單引號,除了單引號這需要在雙引號:

sed 's/$configuration_arefgqrqgrq_341q34tq34t *= *'"'134t135'"'/$configuration_arefgqrqgrq_341q34tq34t = '"'NEWVALUE'/g" 

...或者你可以使用一些臨時變量,以使整個事情更易讀,以及適合於包含在一對雙引號:

directive='$configuration_arefgqrqgrq_341q34tq34t' 
oldvalue="'134t135'" 
newvalue="'NEWVALUE'" 
sed "s/$directive *= *$oldvalue/$directive = $newvalue/g" 

(如果你只希望一個比賽,該/g標誌是多餘的。)

+0

非常感謝我解決了我的問題。 – user2275908

0

您也可以完全避免通過捕捉它們匹配報價:

sed '/$configuration_arefgqrqgrq_341q34tq34t/{ 
     s/\(= *.\).*\(.\) *$/\1NEWVALUE\2/ 
}' input 
+0

最後我做了... – user2275908

0

這可能爲你工作(GNU SED):

sed -r 's/^(\$\S+\s=\s'\'').*('\'')/\1NEWVALUE\2/' file