sed:如何使这个bash命令工作/工作更好?

时间:2011-04-13 22:32:21

标签: regex bash sed

我的目标是简单地以递归的方式将函数调用从一个函数调用到另一个函数调用。在这种情况下,mysql_error(mysql_error_to_log(

过去,我已成功使用以下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问题的解释,但没有找到任何真正清楚的东西。那命令有什么问题?

2 个答案:

答案 0 :(得分:4)

您无需在shell上的引用字符串中转义(),无论这些字符串是使用单个'()'还是双"()"引号引用的。

grep参数中\(的唯一原因是因为该字符串未被引用。

请记住,它是shell处理引号(以及未引用字符串的\(),而不是shell实际调用的程序(在您的情况下为grep和xarg)。

所以sed实际上看到\((不仅仅是(),并且在正则表达式中有特殊含义。

我的一般建议是,只要在shell中有一个“有趣”字符,就可以在shell上引用字符串,从而避免将字符从shell中转义出来。

对于带有转义点\.的“旧”示例 - 这似乎有效,但有一次你从shell中转移点(这不是必需的,但只会产生一个逐字点{ {1}}),另一次你在正则表达式中转义点,其中未转义的点具有特殊含义,因此要求转义表示逐字点。

答案 1 :(得分:3)

尝试没有任何逃脱(这对我有用)。