SED 命令未替换(工作正则表达式)

SED 命令未替换(工作正则表达式)

我正在尝试在我的一个项目中替换所有mysql 到 mysqli,及其参数。为此,我递归地搜索文件夹中带有 mysql 的所有文件,并将其替换为 mysqli。

前任:

mysql_query($query) 到 mysqli_query($link, $query)

我能够捕获所有内容(根据正则表达式测试器),但似乎没有任何内容被替换,也没有错误。

grep -rl mysql PROJECTFILE | xargs sed -ri "s/(mysql_query)\(\$([\w-]+)\)/WhatIWant/g"

我读过有关反斜杠的内容sed但不太明白;输出没有错误,但文件保持不变。如果我只能通过示例或解释知道缺少什么,那就完美了。

将 mysql 替换为 mysqli 很容易,但最好一次性完成所有操作。我使用临时文件只是为了确保它可以正常工作,然后才能在我的项目中尝试它。

谢谢。

编辑:我知道如果我想一次性完成所有工作,我必须捕捉mysql单独并添加一个,但这仅仅是一个想法。


对于 tedron,我想要的输出将与此类似。

sed -ri "s/(mysql_query)\(\$([\w-]+)\)/mysqli_query($link, \2)/g" filename

格伦提出了一个不进行捕获的解决方案。但是,如果我想修改mysql_fetch_array($查询),那么我可能必须使用正则表达式来保留第一个参数并附加MYSQLI_BOTH例如。


解决方案:

感谢 tedron,我能够按照我的方式解决我的问题:

sed -ri 's/(mysql)_query\((\$[a-zA-Z_-]+)\)/\1i_query($link, \2)/' filename

对于 mysqli_fetch_array:

sed -ri 's/(mysql)(_fetch_array)\((\$[a-zA-Z_-]+)\)/\1i\2(\3, MYSQLI_BOTH)/' filename

正如我在问题中所做的那样,使用它来grep立即修改目录。

答案1

你不需要捕获任何东西:

sed 's/mysql_query(/mysqli_query($link, /g' file

-i测试时不要使用,当您对结果满意时添加。

答案2

使用扩展正则表达式 ( ) 的另一种可能性-r

sed -r 's/(mysql)(_query\()/\1i\2$link,/g'

答案3

您不需要围绕 捕获组mysql_query,因为您不会将其复制到替换中。您只需要捕获查询参数,因为每次调用都会有所不同。

sed -ri 's/mysql_query\s*\((\$\w+)\)/mysqli_query($link, \1)/g'

答案4

问题是\w.我只是在试图弄清楚这里发生了什么时自己才发现这一点,但显然,类似\s\w已经是字符类的东西不能在带有 ERE 的其他字符类中使用(它们可以与 PCRE 一起使用)。为了显示:

$ echo foo- | sed -r 's/[\w-]+/bar/'
foobar
$ echo 'w\-foo' | sed -r 's/[\w-]+/bar/'
barfoo
$ echo foo- | sed -r 's/\w+/bar/'
bar-

因此,在字符类中,字符转义类被视为文字字符[ ]。该表达式的[\w-]意思是“匹配\,w或中的任何一个-

要使正则表达式起作用,请使用[a-zA-z_]代替\w或使用分组括号:

$ echo 'mysql_query($query)' | 
    sed -r 's/mysql_query\(\$(\w|-)+\)/WhatIWant/'
WhatIWant

特别针对您的示例:

$ echo 'mysql_query($query)' | 
    sed -r 's/(mysql_query)\((\$[a-zA-Z_-]+)\)/\1($link,\2)/'
mysql_query($link,$query)

相关内容