我需要识别php源代码中的所有查询,这些源代码分布在不同目录下的许多文件中。
我虽然使用grep和MySQL关键字来识别它们。我可以通过两种方式区分此源代码中的查询。
insert
,select
,update
,delete
和alter
。但是有一个问题,双引号中的查询可以分散在多行中。示例:
$newQuery = "Select username
from
usertable"
所以我需要识别"Select username from usertable"
但是grep无法在多行上运行。
我试过了:
egrep -e '"(.*?)\+"' test.php | grep "select"
它适用于单行,但又错过了多行查询。
所以我试过
sed -e '/\"/,/\"/!d' test.php
它返回所有查询,但后来我
sed -e '/\"/,/\"/!d' test.php | grep select
它返回,
"select
这不好。我想我需要在sed中逃避换行。我该如何实现这一目标? bash的任何其他标准命令也可以,例如awk。
答案 0 :(得分:1)
我经常使用perl -pe
代替sed
来表达更多花哨的表达方式。
cat tmp.php | \
perl -pe "s/[\n\r\s]+/ /g" | \ # remove all spaces and line breaks
perl -e '$x=join " ", (<>); print join " ", ($x =~ /".*?(?:select|alter).*?"/gi)'
在最后一行中,您会找到包含select
关键字的所有引号并加入
答案 1 :(得分:1)
使用Perl的一种方式:
perl -00ne 'print $1,"\n" while (/"((select|insert|update|delete|alter).*?)"/sig);' file
以单行获取输出:
perl -00ne 'while (/"((select|insert|update|delete|alter).*?)"/sig){$x=$1;$x=~s/\n//g;$x=~s/\s+/ /g;print "$x\n";};' file
使用join和split获得单行输出:
perl -00ne 'print join " ",split(/\s+/,$1),"\n" while (/"((select|insert|update|delete|alter).*?)"/sig);' file