Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个sed替换为back引用(解析连接表的SQL)_Sql_Unix_Sed - Fatal编程技术网

多个sed替换为back引用(解析连接表的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

我试图使用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_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解决方案