我从stackoverflow中读到了一些关于这个问题的例子,但没有一个帮助过我.
我有一个文件夹,其中有一些sql文件.我想要做的是浏览所有sql文件并搜索短语并检查它是否存在.主要问题是写一个这个短语的grep表达式.
这句话有一个模式:
&uniq的...
(例如:&uniq.hgk56kh/gfgtk或者&uniqjfru5u5gggggt等等)
之后&uniq可能只有21个标志,所以整个表达最多可以有26个标志.
你有什么想法我会这样做吗?
我的例子不起作用:
for f in `ls $WORKDIR/*.sql`
do
if [ $(grep '[&uniq.*]\{1,26}' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.*{1,26}]' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.[[:alnum:]]{1,26}}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.[[:alnum:]]{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.[A-Za-z0-9]{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.[A-Za-z0-9]{1,26}]' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.[A-Za-z0-9]\{1,26\}]' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.*\{1,26\}]' $f) == 0 ]; then echo
if [ $(grep -w '[&uniq.*}\{1,10\}' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.[A-Za-z0-9]{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '[&uniq.*{1,26}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.*'{1,26} $f) == 0 ]; then echo
if [ $(grep -E '&uniq.*.\{1,26\}' $f) == 0 ]; then echo
if [ $(grep -E '&uniq.[A-Za-z0-9]{1,26}' ~/$f) == 0 ]; then echo
if [ $(grep -e '[&uniq.*]\{1,26}' $f) == 0 ]; then echo
done
Run Code Online (Sandbox Code Playgroud)
输入的一些示例:正确:&uniq._short_examples&uniq._ifs21t&uniq._FM_Z2IO_RHHU&uniq._kontr_save错误:&uniq.another_example_of_way_to_long_string&uniq.fhtygjygjyj767kjuhkhk87k8ukgfh56yhgyj76jujhyjk
这个例子之间是一些典型的sql文件行,如下所示:
SELECT a.YY,
a.RRX_ID,
a.MSRG_TYPE,
a.TGHSEB,
a.PROVIDERHJJ,
a.SALE_PROVIDERYTR,
a.REQUEST_PPL,
a.CONTENT_NAME, -- Name of content
a.CONTENT_TYPE, -- Name of content2
b.NET_AMOUNT,
a.SALE_MODEL_FROM_PAST,
a.SERVICE_MODE_ON,
a.RESPONSE_STATUS_CODE,
a.ERROR_DESC_FILE
FROM BBV.RAQ45_TJKIO a,
(SELECT * from &uniq.FGGT8IO) b
Run Code Online (Sandbox Code Playgroud)
我建议使用以下内容:
for f in /path/to/sql/files/*.sql; do
if grep -q '&uniq.\{1,21\}' "$f"; then
echo "match in file $f"
fi
done
Run Code Online (Sandbox Code Playgroud)
这匹配"&uniq",后面是目录中任何文件中的1到21个字符$f.所述-q开关grep装置没有输出和grep的返回码指示是否有一个匹配或没有.
大概你也想在模式的任何一边添加一些边界,这样你就不会匹配abc&uniqabc123abc123abc123 123456789.执行此操作的最佳方法取决于您的输入和您使用的grep版本.
根据您的示例输入判断,您可以使用该模式' &uniq.\{1,21\})'将模式与之前的空格和)之后的结束进行匹配.
根据注释中的额外信息,您应该将模式更改为类似的内容'&uniq\.[[:alnum:]]\{1,21\}[^[:alnum:]]',以便匹配后面的文字点&uniq,1到21个字母数字字符,然后是任何非字母数字字符.