我对此问题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.sql
和query2.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);
谢谢
答案 0 :(得分:2)
awk '/-- filename/{if(f)close(f); f=$3;next} !/eof/&&/./{print $0 >> f}' input
简要说明,
-- filename{if(f)close(f); f=$3;next}
:找到包含文件名的记录,并将其分配给f
!/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