2011-12-14 162 views
4

我一直在使用SED(Bash shell)轉義轉義單引號的問題。sed單引號

我需要

$cfg['Servers'][$i]['password'] = ''; 

$cfg['Servers'][$i]['password'] = 'mypassword'; 

我已經試過是:

sed -i "s/$cfg['Servers'][$i]['password'] = '';/$cfg['Servers'][$i]['password'] = '$rootpassword';/g" /usr/share/phpmyadmin/libraries/config.default.bak 

這最終真正混雜行。

$cfg['Servers'][$i]['password['Servers'][]['passsword'] = 'mypassword' 

我試過'\''來逃避單引號,我認爲一切都在陽光下,但不能在那裏得到它。

任何人都可以指出我可能的明顯錯誤嗎?

謝謝。

+0

這是唯一帶有````的行嗎?如果是這樣,就匹配。另外,爲extended-regex添加`-r`標誌。這將解決很多問題。 – 2011-12-14 19:50:55

+0

請注意其他文字 - '$`,`[`,`]` – 2011-12-14 19:53:58

回答

4
$ sed -i "s/\$cfg\['Servers'\]\[\$i\]\['password'\] = '';/\$cfg['Servers'][\$i]['password'] = '\$rootpassword';/g" file 
+0

這工作 - 只需要添加一個額外的\ infront $ rootpassword。 我想我需要閱讀更多關於轉義。我想我越來越爲了某些事物逃脫了。即爲什麼`[\ $ i]`在另一個地方比'`[\ $ i']``。 – Chasester 2011-12-14 22:31:09

1

試試這個:

sed -i "/Servers.*password.*''$/s/''/'foo'/" /path/to/your/testfile 

匹配的是包含一條線 「anything..Servers..anything..password..anything .. ''」(與''結束),並在該行替換爲'''foo'

這可以匹配多行,但只有第一個的發生將會改變。 測試一下,很有可能.. Servers .. password .. ''只在一行上。

或者你可以逃避一切。

+0

有趣,看起來像匹配兩行,Servers .. password和Servers .. nopassword。 但是 - 我需要的是第一個例子。 – Chasester 2011-12-14 21:37:33

13

而不是轉義,您可以使用\x27單引號。這不僅適用於sed,awk等。

看到測試:

kent$ cat tt 
$cfg['Servers'][$i]['password'] = '' 

kent$ sed -r 's/(\$cfg\[\x27Servers\x27\]\[\$i\]\[\x27password\x27\] \= \x27)\x27/\1mypassword\x27/g' tt 
$cfg['Servers'][$i]['password'] = 'mypassword' 

注意到,sed的行可能不是你的問題的最佳解決方案,例如將整個字符串放到「s /../」可能不是必需的。不過,我只想說明\ x27的工作方式。