gpt4 book ai didi

Sed 模式没有产生预期的结果

转载 作者:行者123 更新时间:2023-12-01 00:50:37 25 4
gpt4 key购买 nike

我有一个包含很多 SQL INSERT 结构的文件。我正在尝试编写一个 sed 脚本来提取包含 INSERT 表名称的行。

   INSERT INTO Table1 values( val1, vale2, val3 );

INSERT INTO Table2
VALUES( val1, vale2, val3 );

INSERT
INTO
Table3
VALUES( val1, vale2, val3 );

insert into table4
SELECT col1 from
table4
where condition1 = condition2
;
INSERT
INTO
table5 (col1, col2, col3)
VALUES( val1, vale2, val3 );

insert into table6 (col1,
col2,
col3, col4
)
SELECT col1, col2, col3,
col4 FROM
table6
WHEREcondition1 = condition2
;

我的输出应该是:
 insert into table4
insert into table6

这是我尝试过的。但是,我不确定为什么我的 sed 模式不起作用。该脚本正在选取没有 SELECT 字的行。我正在使用 GNU sed 4.2。任何帮助将不胜感激。
# select all lines between INSERT and ; 
sed -n '/Insert/I,/;/ {
#delete the blank line
/^\s*$/{
i\ ...deleting blank line
=
d}
#selecting sub pattern range between INTO and SELECT
/into/I, /Select/I {
i\
...inside the Into---Select range
p
}
}' < testfile

我目前的输出是:
...inside the Into---Select range
INSERT INTO Table1 select values( val1, vale2, val3 );
...deleting blank line
120
...inside the Into---Select range
INSERT INTO Table2
...inside the Into---Select range
values( val1, vale2, val3 );
...inside the Into---Select range
INSERT
...inside the Into---Select range
INTO
...inside the Into---Select range
Table3
...inside the Into---Select range
values( val1, vale2, val3 );
...inside the Into---Select range
insert into table4
...inside the Into---Select range
SELECT col1 from
...inside the Into---Select range
INTO
...inside the Into---Select range
Table5 (col1, col2, col3)
...inside the Into---Select range
values( val1, vale2, val3 );
...inside the Into---Select range
insert into table6 (col1,
...inside the Into---Select range
col2,
...inside the Into---Select range
col3, col4
...inside the Into---Select range
)
...inside the Into---Select range
SELECT col1, col2, col3,

最佳答案

$ sed -rn 'H;1h;/;/!d;x; s/.*insert[[:space:]]+into[[:space:]]+([[:alnum:]]+)[[:space:]]+([(][^)]*[)][[:space:]]+)?select.*/insert into \1/Ip' file
insert into table4
insert into table6

这个怎么运作
  • -r
    这告诉 sed 使用扩展的正则表达式语法。
  • -n
    这告诉 sed 不要打印任何东西,除非我们明确要求它。
  • H;1h;/;/!d;x;
    这将读取所有行到模式空间中,并以带有分号的第一行停止。

    更详细地,H;1h将我们读入的每一行附加到保持空间中。如果该行不包含 ; ,然后我们删除该行(命令 d)。这具有告诉 sed 跳过其余命令并从下一行重新开始的效果。如果我们到达 x命令,这意味着最后一行包含一个分号,; . x将我们保存在保持空间中的所有内容交换回模式空间。
  • s/.*insert[[:space:]]+into[[:space:]]+([[:alnum:]]+)[[:space:]]+([(][^)]*[)][[:space:]]+)?select.*/insert into \1/Ip
    这将搜索该行以查找 into 之后的单词及之前 select并打印出来。为了获得你想要的输出,这个命令可以选择允许在 select 之前出现一个带括号的表达式。 .

  • 使用范围的替代版本
    $ sed -rn '/insert/I,/;/{H;/;/!d;x; s/.*insert[[:space:]]+into[[:space:]]+([[:alnum:]]+)[[:space:]]+([(][^)]*[)][[:space:]]+)?select.*/insert into \1/Ip}' file
    insert into table4
    insert into table6

    关于Sed 模式没有产生预期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31554388/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com