是否有任何干净的grep单行程序只能从PHP文件中获取PHP源代码(<?
和?>
之间的代码)?到目前为止,我已经尝试过:
grep -oiE "<\?php[[:print:]]*\?>" name_of_php_file
但它似乎返回了混乱的条目,如:
<?php print $row[0];?>"><img src="gallerybig/<?php echo $row[1];?>
期待一个只返回PHP源的单行,没有任何混乱的条目。 sed和awk都行。
编辑:预期的输出是PHP源代码,即使它跨越多行。示例输出不好,因为它包含以下HTML:"><img src="gallerybig/
编辑2:@SigmaPiEpsilon给出的答案有效,但grep不会打印跨越多行的代码。例如,此代码段不会显示在输出中:
<?php
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>
你必须在?
之后添加一个[[:print:]]*
来使用非贪婪的搜索。这在普通grep中不可用,但是通过指定-P
标志而不是-E
,可以使用Perl语法。检查man grep
以确保您的grep支持此功能。
$ Var='<?php print $row[0];?>"><img src="gallerybig/<?php echo $row[1];?>'
$ echo $Var | grep -oiP "<\?php[[:print:]]*?\?>"
<?php print $row[0];?>
<?php echo $row[1];?>
要在多行上匹配此项,您必须指定换行符并使用-z
标志。正则表达式有点棘手,但不是用?
指定非贪婪的匹配,你可以使用补码匹配作为[^?]
,它匹配除?
之外的所有内容。见下文
$ cat test_php
<?php
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>
<?php print $row[0];?>"><img src="gallerybig/<?php echo $row[1];?>
$ grep -oizP "<\?php[^?]*\n*\?>" test_php
<?php
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>
<?php print $row[0];?>
<?php echo $row[1];?>
你可以用GNU awk完成你到目前为止所描述的内容:
$ gawk -v RS='?>' 'RT{sub(/.*<\?/,"<?"); print $0 RT}' file
<?php
$str="select c_id,c_description,cate_name,date from book_table ;";
$res=mysql_query($str); ?>
但它显然不健壮,因为这不会在评论内部或内部字符串或HTML内部或......内部考虑?>
,所以它是否会做你想要的取决于你没有显示的非平凡案例我们还有它们存在于你真实的输入中。