使用sed在两个文本行之间提取文本

时间:2015-09-11 20:03:05

标签: bash parsing sed

我尝试使用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表的字段行?

谢谢

1 个答案:

答案 0 :(得分: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