2011-06-23 147 views
3

我在my.cnf文件逃離美元符號

datadir = /var/lib/mysql 

以下更改它mysql3307預期一條線。

sed -i 's/\/var\/lib\/mysql$/\/var\/lib\/mysql3307/' /etc/my.cnf 

但是,如果我有以下幾點:

datadir = /var/lib/mysql/ 

那麼下面不改變路徑預期:

sed -i 's/\/var\/lib\/mysql\/$/\/var\/lib\/mysql3307/' /etc/my.cnf 

我想改變路徑mysql3307其中DATADIR會/ var/lib/mysql(帶或不帶/)

更新:

以下是問題: 上述兩個命令都在一臺服務器上運行,並且它們都不起作用。

下正常工作,但我需要補充的是$,表示與MySQL結束線/

sed -i 's/\/var\/lib\/mysql\//\/var\/lib\/mysql3307/' /etc/my.cnf 

觀察:

的carot符號^按預期工作,但行結束標誌$不。任何線索?

更新:

似乎使用 「DOS2UNIX的」 命令後進行工作。

+2

當在其中使用'/'的字符串(例如文件路徑)使用sed時,可能需要使用別的東西作爲分隔符,如':'。 'sed -i's:/ var/lib/mysql $:/ var/lib/mysql3307:'/etc/my.cnf'有點更好看:) –

+0

我不太確定問題出在哪裏?我回應你的第二個例子字符串到你的第二個例子sed並得到'datadir =/var/lib/mysql3307' –

+0

是的。這個問題是錯誤的。實際上它們都不在一臺服務器上運行,而且這兩個命令都可以在另一臺服務器上運行 – shantanuo

回答

2

如果您的意圖是隻更改具有該特定目錄的路徑,則需要更復雜一些。你必須趕在沒有尾隨/的行的末尾並且你也必須趕上它在任何地方具有尾隨/(行或不行)。

但是你不想要像/var/lib/mysqlplus這樣的東西,因爲這是一個完全不同的目錄。

考慮使用擴展的正則表達式,並使用不同的分隔符來讓命令看起來不像鋸齒(/\/\/\/\/\/\/\/\)。有了這些變化,一個小的修改正則表達式本身,它工作正常:

$ echo ' 
/var/lib/mysqlplus 
/var/lib/mysql/ 
/var/lib/mysql 
/var/lib/mysql/xyz' | sed -E 's|/var/lib/mysql([$/])|/var/lib/mysql3307\1|' 

/var/lib/mysqlplus 
/var/lib/mysql3307/ 
/var/lib/mysql 
/var/lib/mysql3307/xyz 
1

的文字字符采用$可能需要進行轉義,但不是作爲一個錨意味着字符串的結尾。

順便說一句,你的正則表達式將是一個更容易閱讀,如果你使用一個不同的分隔符,所以你沒有逃脫/正則表達式

sed -i `'s|/var/lib/mysql/|/var/lib/mysql13307/|' /etc/my.cnf 
0

如果你特別希望只是改變在datadir值,下面的命令是比較合理的:
sed -i.bak 's| *datadir *=.*|datadir = /var/lib/mysql3306/|g' /etc/my.cnf

注:-i.bak後綴.bak原始文件的製作CH之前備份安格。