我现在有这样的SQL
select dt from a.b.c where dt = '20210808' limit 10
我想先通过前缀namespace 进行匹配,如果匹配成功就返回表名, 比如我这里有 a.d. 多个前缀, a. 存在匹配成功,然后返回表名c 。如果这里是a.b 就返回b,这个正则该怎么写?用sed 或者 awk 甚至在PHP中实现
现在这个是我用PHP写的,但是获取的不是我想要的
$sql = "select dt from a.b.c where dt = '20210808' limit 10";
$tmp_table_name_parten = '/\.([^.]*$)/';
preg_match_all($tmp_table_name_parten, $sql, $match);
result:[[".c where dt = '20210808' limit 10"],["c where dt = '20210808' limit 10"]]
我现在能想到的就是基于空格+前缀+空格 这种形式来匹配表名,另外就是在sed awk 里怎么写呢?
另外还有一点需要注意就是a.b.c会有下划线的情况,例如: a_a.b_b.c
(?<=\.)[^.\s]+(?!\.)(?=\s|$)
sed 不支持零宽断言。可以用下面这个,不过会把
.
和后面的空白符一并选中。echo -e 'select dt from a_a.b_b.c_c where dt = 20210808 limit 10' | sed -n 's/\.\w\+\s/*****/ p'