2011-04-13 44 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

尝试没有任何逃脱(对我而言)。

相关问题