我正在尝试在我的一个项目中替换所有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)