我正在尝试编写一个bash脚本,该脚本能够从部分匹配字符串的文件(在目录中)中grep表名。
对于我的情况,我希望按照某种约定(不区分大小写)返回所有表引用:
- tblpl
- tbljoin
- tbldim
这将理想地返回这样的列表:
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.tblColorWatches"、"db.tpljoinCustomerSegment"…
它查找任何字母和句点的混合序列,后面跟着.tblpl
或.tbljoin
或.tbldim
,后面跟着一个或多个字母(请参见regex101链接)
试试这个正则表达式:
[a-zA-Z.]+.tbl(pl|join|dim)[a-zA-Z]+
我将使用-E
标志来使用扩展正则表达式:
grep -rioE '[a-z]*.[a-z]*.tbl(pl|join|dim)[a-z]*' d:/sqldirectoryhere