我从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
输入的一些例子: 正确: &安培; 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
答案 0 :(得分:6)
我建议使用以下内容:
for f in /path/to/sql/files/*.sql; do
if grep -q '&uniq.\{1,21\}' "$f"; then
echo "match in file $f"
fi
done
这匹配"& uniq",后面是目录$f
中任何文件中的1到21个字符。 -q
切换到grep
表示没有输出,grep的返回码表示是否匹配。
大概你也想在模式的任何一边添加一些边界,这样你就不会像abc&uniqabc123abc123abc123 123456789
那样匹配。执行此操作的最佳方法取决于您的输入和您正在使用的grep版本。
根据您的示例输入判断,您可以使用模式' &uniq.\{1,21\})'
将模式与之前的空格匹配,然后将结束)
匹配。
根据评论中的额外信息,您应该将模式更改为'&uniq\.[[:alnum:]]\{1,21\}[^[:alnum:]]'
,以匹配&uniq
之后的文字点,1到21个字母数字字符,然后是任何非字母数字字符。