【问题标题】:Extract text between two text lines using sed [duplicate]使用 sed 在两个文本行之间提取文本 [重复]
【发布时间】:2015-09-11 20:03:05
【问题描述】:

我正在尝试使用 sed 解析一个 sql 文件。我需要根据下面的示例提取位于一组行(field1 到 field 3)之间的内容。这是一个例子

Create table xyz
(
   field1 varchar(255),
   field2 varchar(255),
   field3 int
);

Create table 123
(
    fieldx varchar(255),
    fieldy varchar(255),
    fieldz int
);

如何仅使用 sed 提取属于 xyz 表的字段线?

谢谢

【问题讨论】:

  • 找到所有非空白缩进行就足够了吗?如果不是,您要查找的“行组”的标准是什么:以( 开头并以) 结尾?
  • sed 可能不会成为你的朋友。我想说你几乎需要用某种高级语言编写一个程序,或者在一个好的文本编辑器中编写一个宏来完成我认为你所追求的事情。
  • 是可以的,但是会很复杂,会很挑剔,很脆。如果文件中仅包含创建表语句,并且主键和约束/索引等不在表定义中,并且如果计算列的公式不在表定义中,则这是可行的,否则我会跑并隐藏。

标签: bash parsing sed


【解决方案1】:

这会打印以() 开头的行之间的所有内容:

$ sed -n '/^(/,/^)/{ /^[()]/d; p;}' file
   field1 varchar(255),
   field2 varchar(255),
   field3 int

工作原理

-n 选项告诉 sed 除非我们明确要求,否则不要打印任何内容。

/^(/,/^)/ 是一个范围。它选择以( 开头的行和以) 开头的行结束的行。对于所有这些行,将执行大括号中的命令{...}

/^[()]/d 删除以() 开头的行。

对于任何剩余的行,p 命令会打印出来。

限制输出到表 xyz

$ sed -n '/^Create table xyz/,/^)/{ /^Create/d; /^[()]/d; p;}' file
   field1 varchar(255),
   field2 varchar(255),
   field3 int

【讨论】:

  • 对于非常简单的表定义,它可以工作,但它不适用于更复杂的东西,自动增量,默认值,主键等。
  • 问题是我只需要特定表的字段。您的示例提取了(和)之间的所有内容;对于所有表。您将如何修改它以使其仅提取上面显示的该表的字段?
  • @JohnnyLoo 查看将输出限制为 table xyz 的代码的更新答案。
  • 是的,你明白了。谢谢,我打算先使用 sed 两次提取该表,然后提取 (and) 之间的内容,但我更喜欢你的方法。谢谢
【解决方案2】:

sed 用于在单个行上进行简单替换,仅此而已。除此之外,您还应该使用 awk 来实现简单、清晰、可移植性以及优秀软件的几乎所有其他属性:

$ awk -v RS= 'sub(/Create table xyz\n\(\n/,"") && sub(/\n\);/,"")' file
   field1 varchar(255),
   field2 varchar(255),
   field3 int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 2014-11-13
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多