我正在编写一个bash脚本,用于检测SQL查询中的某些字符串类(如所有大写,全部小写,所有数字字符等等)。在进行分类之前,我想提取所有引用的字符串。我无法获得正确的正则表达式,将从查询字符串中正确提取引用的字符串。例如,从TPCH基准测试中获取此查询:
select
o_year,
sum(case
when nation = 'JAPAN' then volume
else 0
end) / sum(volume) as mkt_share
from
(
select
extract(year from o_orderdate) as o_year,
l_extendedprice * (1 - l_discount) as volume,
n2.n_name as nation
from
part,
supplier,
lineitem,
orders,
customer,
nation n1,
nation n2,
region
where
p_partkey = l_partkey
and s_suppkey = l_suppkey
and l_orderkey = o_orderkey
and o_custkey = c_custkey
and c_nationkey = n1.n_nationkey
and n1.n_regionkey = r_regionkey
and r_name = 'ASIA'
and s_nationkey = n2.n_nationkey
and o_orderdate between date '1995-01-01' and date '1996-12-31'
and p_type = 'MEDIUM BRUSHED BRASS'
) as all_nations
group by
o_year
order by
o_year;
它是一个复杂的查询,但除此之外。我需要能够从这个文件中提取所有单引号字符串并在它们自己的行上打印它们。即:
'JAPAN'
'ASIA'
'1995-01-01'
'1996-12-31'
'MEDIUM BRUSHED BRASS'
现在,(因为我对正则表达式不是很熟悉)我所拥有的只是:
printf '%s\n' $SQL_FILE_VARIABLE | grep -E "'*'"
但是这不支持带空格的字符串,并且当多个字符串位于文件的同一行时它不起作用。理想情况下,我可以在我的bash脚本中使用它,因此最好解决方案是grep / sed / perl。我已经做了一些谷歌搜索,并找到了类似问题的解决方案,但我无法让他们特别为此工作。
任何想法我怎么能做到这一点?感谢。
答案 0 :(得分:2)
你想要这样的东西:
printf '%s\n' $SQL_FILE_VARIABLE | grep -E "'[^']*'"
答案 1 :(得分:0)
为什么不试试/'(.*)?'/g
这意味着,在引号之间,匹配所有内容并将其提取出来。