多个sed替换为back引用(解析连接表的SQL)
我试图使用sed解析一些大型SQL查询日志,并希望提取每个查询中连接的所有表的名称。以下是我正在尝试的:多个sed替换为back引用(解析连接表的SQL),sql,unix,sed,Sql,Unix,Sed,我试图使用sed解析一些大型SQL查询日志,并希望提取每个查询中连接的所有表的名称。以下是我正在尝试的: echo '[SQL_STMT="SELECT A FROM TABLEA JOIN TABLEB ON SOMETHING JOIN TABLEC ON SOMETHINGELSE WHERE A = 1"]' \ | sed -e 's/SQL_STMT=.*JOIN \([A-Z0-9_]*\) .*\]$/SQL_JOINS="\1"]/g' 但这只会返回以下内容: [SQL_JO
echo '[SQL_STMT="SELECT A FROM TABLEA JOIN TABLEB ON SOMETHING JOIN TABLEC ON SOMETHINGELSE WHERE A = 1"]' \
| sed -e 's/SQL_STMT=.*JOIN \([A-Z0-9_]*\) .*\]$/SQL_JOINS="\1"]/g'
但这只会返回以下内容:
[SQL_JOINS="TABLEC"]
我想看到的是这样的东西:
[SQL_JOINS="TABLEB TABLEC"]
并使其适用于任意数量的联接
那么,如何构造backreference,使其获得所有连接的表呢?如果您对perl解决方案满意,请尝试以下方法:
$ echo "......" | perl -ne '@x=/JOIN (\w+)/g;print "[SQL_JOINS=\""."@x"."\"]";'
在进行上述测试时:
$ echo "[SQL_STMT=\"SELECT A FROM TABLEA JOIN TABLEB ON SOMETHING JOIN TABLEC ON SOMETHINGELSE WHERE A = 1\"]" | perl -ne '@x=/JOIN (\w+)/g;print "[SQL_JOINS=\""."@x"."\"]";'
[SQL_JOINS="TABLEB TABLEC"]
Sed解决方案:
echo ...|sed -n ':a;/JOIN/{s/[^J]*JOIN \([A-Z0-9_]*\)/\1\n/;P;D;ta}' | sed -e ':a;N;s/\n/ /;ta' | sed 's/.*/[SQL_JOINS=\"&\"]/'
第一个sed打印所有表名,第二个sed将所有表名行合并为一行,最后一个sed将其格式化为所需格式。
=.*JOIN
-在这个*
中,将使用贪婪搜索代替*?
@sarathi:据我所知,没有sed
实现支持*?
表示法。@sarathi,我尝试了以下方法:>echo'[SQL\u STMT=“从表格中选择A在某物上连接表格B在某物上连接表格C,其中A=1”]。\124; sed-e's/SQL\u STMT=.*?([A-Z0-9\]*).*$/SQL\U JOIN=“\1”]/g”但这并没有抓住任何东西。我们希望避免使用perl,但这样就完成了任务。谢谢。@MichaelSorensen:添加了sed解决方案