【问题标题】:Join or merge lines between two patterns inclusive (sed or awk)连接或合并两个模式(包括 sed 或 awk)之间的线
【发布时间】:2020-05-13 17:41:14
【问题描述】:

我有一个包含多行 SQL 语句的大文件,我需要将其“加入”到一个内衬中。考虑以下几点:

create unique index <bla1 bla1>
    <more bla1 bla1>;
alter table <bla2 bla2>
    <more bla2 bla2>;
create index <bla3 bla3>
    <more bla3 bla3>;
alter table <bla4 bla4>
    <more bla4 bla4>
    <some more bla4 bla4>;

其中 pattern1 是“alter table”,而 pattern2 是“;”。我希望输出是:

create unique index <bla1 bla1>
    <more bla1 bla1>;
alter table <bla2 bla2> <more bla2 bla2>;
create index <bla3 bla3>
    <more bla3 bla3>;
alter table <bla4 bla4> <more bla4 bla4> <some more bla4 bla4>;

我看过其他关于用 sed 或 awk 合并行的帖子(最接近的是 sed join lines togetherHow to print lines between two patterns, inclusive or exclusive (in sed, AWK or Perl)? 有点给了我一些想法),但他们不能完全完成任务。 虽然我更喜欢 sed 或 awk 中的答案,但其他任何人都将不胜感激。 提前致谢!

【问题讨论】:

  • 第一个链接方法如何失败?那些是前导制表符还是空格?
  • 第一个链接方法如何失败? - 当最后一个字段为“0”时加入。我可以推断说最后一个字符是“;”但这也会加入“创建索引”,这是我不想要的。那些领先的制表符或空格? - 它们是空格。
  • 我没有好版本的 sed 方便(长话短说),但试试这个:sed ':a;/^alter table/{/;$/!{N;s/\n //;ba}}'
  • @Beta - 效果很好!我需要处理一些难看的额外空间,但它可以按需要工作!添加您的建议作为答案,以便我可以选择它作为接受的答案。此外,我们将不胜感激......谢谢!!!
  • 额外的空格。 [facepalm] 让我再试一次...

标签: awk sed merge ksh


【解决方案1】:

试试这个:

sed ':a;/^alter table.*[^;].$/{N;s/\n //;ba}'

编辑:这就是没有真正的工具来试验的结果。好的,回到这个:

sed ':a;/^alter table/{/;$/!{N;s/\n //;ba}}'

【讨论】:

  • 实际上您在上面的 cmets 中发布的回复效果很好。这个,没那么多……^_^
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多