2011-04-13 89 views
0

我的目標是簡單地將函數調用從一個地方改變到另一個地方,在第一個地方找到的地方遞歸地進行調用。在這種情況下,mysql_error(mysql_error_to_log(sed:我怎樣才能使這個bash命令工作/工作更好?

在過去,我已經成功地使用下面的grep & sed的語句:

grep -rl connection1\.php ./ | xargs sed -i 
    's/connection1\.php/account_db_user\.connection\.php/' 

所以這次我想類似的東西(只是一個不同的角色,(,被轉義):

grep -rl mysql_error\(./ | xargs sed -i 's/mysql_error\(/mysql_error_to_log\(/' 

但我收到此錯誤:

sed: -e expression #1, char 37: Unmatched (or \(

它似乎告訴我,我試圖逃脫(是不正確的。我在谷歌搜索該sed問題的解釋,但沒有發現任何真的很清楚。那麼這個命令有什麼問題?

回答

4

你不需要逃避()在外殼上引用的字符串,不管這些字符串與單'()'或雙"()"引號括起來。

grep中參數\(工作的唯一原因是因爲該字符串未被引用。

請記住,它是處理引號(和非引號字符串的\()的shell,而不是shell實際調用的程序(在你的情況下是grep和xarg)。

所以sed實際上看到\((不僅僅是(),並且它在正則表達式中有特殊含義。

我的一般建議是在shell中總是引用字符串,只要字符中可能存在「有趣」的字符,從而避免從shell中完全轉義字符。

至於轉義點\.的「老」例子 - 這看起來很有效,但有一次你從shell中逃脫了點(這不是必須的,只是結果只是一個逐字點.),並且另一次你在一個正則表達式中逃避點,一個非轉義的點有一個特殊的含義,因此要求轉義意味着一個逐字點。

+0

不要理解爲什麼(不是一個需要轉義的元字符才能在正則表達式中顯示爲正常字符,認爲轉義是爲了顯示正常字符,但它確實可以完成這項工作) – Kzqai 2011-04-14 02:10:50

+0

There是正則表達式和正則表達式,一些正則表達式定義具有'('作爲元字符和'\('作爲字面括號,有些正好相反。sed regexp使用'('爲字面paren和'\('爲元字符。perl regexp反過來也是如此 – ndim 2011-04-14 15:00:16

+0

好吧,這很煩人,但是很高興知道,我必須留意這個問題。 – Kzqai 2011-04-14 15:17:24

3

嘗試沒有任何逃脫(對我而言)。

相關問題