我试图编写一个bash脚本,该脚本能够从跨文件(在目录中)中与字符串部分匹配的grep表名。
对于我的情况,我想按照某个约定(不区分大小写)返回所有表引用:
理想情况下,这将返回如下列表:
product.dbo.tblplColors
product..tblplMonograms
solr.dbo.tbljoinSkuCategory
如果这有助于降低一些复杂性,那么一次匹配一个表名格式也会没问题。为了澄清,这将只返回表名 - 而不是文件名/所有文件内容。可以肯定地说,表名的末尾将由一个空格分隔,因为它是SQL。
我开始的地方:
grep -rio 'tblpl*[^ ]' d:/sqldirectoryhere > c:/Users/foo/Desktop/tables.txt
在此感谢任何帮助/指示 - 谢谢!
编辑:这两个答案都是我的用例。我最后添加了扩展的正则表达式(非常感谢这个建议),但我必须赞扬编写大部分内容的人。谢谢大家!
我的扩展用例最终成为一种返回此表列表然后将其编写为查询友好格式的方法,因此我可以将它们放入WHERE IN子句中。万一有人需要它:
grep -rioE --no-filename '[a-zA-Z_.]+\.tbl(pl|join|dim)[a-zA-Z_]+' {DIRECTORY_HERE} | sed -n 's/.*/\x27&\x27/; $! s/$/,/; 1 h; 1 ! H; $ { x; s/\n/ /g; p; }'
返回格式为:' db.tblplColorSwatches',' db.tbljoinCustomerSegment' ...
答案 0 :(得分:1)
它会找到任意字母和句点的混合序列,然后是.tblpl
或.tbljoin
或.tbldim
,后跟一个或多个字母(请参阅regex101 link)
试试这个正则表达式:
[a-zA-Z.]+\.tbl(pl|join|dim)[a-zA-Z]+
答案 1 :(得分:1)
我会使用-E
标志来使用扩展正则表达式:
grep -rioE '[a-z]*\.[a-z]*\.tbl(pl|join|dim)[a-z]*' d:/sqldirectoryhere