首页 > 解决方案 > sed 提取子串

问题描述

我正在尝试使用 sed 从 sql 查询中提取表名。

到目前为止,我有:

 echo 'select * from marketo.leads limit 1;' | sed -n 's/.*from \(.*\) .*/\1/p'

结果: marketo.leads limit

不知何故,下一个词也被抓住了。

标签: awksed

解决方案


原因是正则表达式是贪婪的,所以.*尽量吞下它。在这种情况下,它匹配marketo.leads limit, 与行的其余部分匹配1;(空格、一、分号)。

尝试

echo 'select * from marketo.leads limit 1;' | sed -n 's/.*from \([^ ]*\) .*/\1/p'

当然,这不是一个完美的解决方案——如果线路是

select * from ['My funny table'] limit 1:

推荐阅读