我在unix中有一个文件,其中包含表单的select语句列表。
Select Colmn, From Table, Where ....
Select Colmn, From Table2, Where ....
Select Colmn, From Table3,Table4 Where ....
等等。
是否有正则表达式可以从文件中提取所有表名?
对于
的情况Select Colmn, From Table3,Table4 Where ....
我需要Table3和Table4。我相信一个简单的正则表达式不会吗?我可能不得不写一个程序来做这个?这个案子怎么样,
Select Colmn,
From Table3 ,
Table4
Where ....
这两个表都在多行上。
答案 0 :(得分:1)
试试这个,你在尝试中遗漏了,
perl -ne '$\ = $/; print for /\sfrom\s+([\w,]+)/ig' input.txt
$ cat input.txt
Select Colmn, From Table, Where ....
Select Colmn, From Table2, Where ....
Select Colmn, From Table3,Table4 Where ....
$ perl -ne '$\ = $/; print for /\sfrom\s+([\w,]+)/ig' input.txt
Table,
Table2,
Table3,Table4
使用sed
添加示例以在多行上获取表格:
$ cat input.txt
Select Colmn, From Table, Where ....
Select Colmn, From Table2, Where ....
Select Colmn, From Table3,
Table4
Where ....
$
$ sed -e 's/.*From //' -e 's/Where.*$//' -e '/^$/d' input.txt
Table,
Table2,
Table3,
Table4
答案 1 :(得分:0)
您可以使用以下perl
单行来匹配您的模式。
perl -ne '$/=undef; print $_ . "\n" for /(?<=from)\s*(\S*\s*\S*)\s*(?=where)/ig' file
$ cat file
Select Colmn, From Table, Where ....
Select Colmn, From Table2, Where ....
Select Colmn, From Table3,Table4 Where ....
Select Colmn,
From Table5,
Table6
Where ....
$ perl -ne '$/=undef; print $_ . "\n" for /(?<=from)\s*(\S*\s*\S*)\s*(?=where)/ig' file
Table,
Table2,
Table3,Table4
Table5,
Table6
这应该与您的大多数语句匹配,除非您有一个select语句,其中的表分布在两行以上。在这种情况下,请随意使用正则表达式来满足您的需求。