bash:模式x和y之间的单独线段

时间:2018-07-19 07:37:40

标签: bash awk sed

我对此问题Sed/Awk - pull lines between pattern x and y有一个类似的问题,但是,在我的情况下,我想将每个行块输出到单个文件(以第一个模式命名)。

输入示例:

-- filename: query1.sql
-- sql comments goes here or else where
select * from table1
    where id=123; 
-- eof


-- filename: query2.sql
insert into table1
    (id, date) values (1, sysdate);
-- eof

我希望bash脚本生成2个文件:query1.sqlquery2.sql,其内容如下:

query1.sql:

-- sql comments goes here or else where
select * from table1
    where id=123;

query2.sql:

insert into table1
    (id, date) values (1, sysdate);

谢谢

3 个答案:

答案 0 :(得分:2)

awk '/-- filename/{if(f)close(f); f=$3;next} !/eof/&&/./{print $0 >> f}' input

简要说明,

  1. -- filename{if(f)close(f); f=$3;next}:找到包含文件名的记录,并将其分配给f
  2. !/eof/&&/./{print $0 >> f}:如果以下各行都不包含'eof'也不为空,请将其保存到相应的文件中。

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -r '/-- filename: (\S+)/!d;s##/&/,/-- eof/{//d;w \1#p;s/.*/}/p;d' file |
sed -nf - file

从输入文件创建sed脚本并针对输入文件运行它

每个查询需要两行,因为查询程序必须用大括号括起来,并且w命令必须以换行符结尾。

答案 2 :(得分:0)

使用GNU awk为您处理多个打开的文件:

awk '/^-- eof/{f=0} f{print > out} /^-- filename/{out=$3; f=1}' file

或任何awk:

awk '/^-- eof/{f=0} f{print > out} /^-- filename/{close(out); out=$3; f=1}' file