2013-10-17 17 views
2

我在一个目录中有一千个文件,每个文件包含以关键字DEFINE开头并以分号结尾的定义变量数(;),我想复制所有出现的该关键字(包含)之间的数据转换为目标文件。将两个关键字中的一段复制到目标文件

例子:下面是文本文件的内容:

/* This code is for lookup */ 
DEFINE variable as a1 expr= extract (n123f1 using brach, code); 

END. 

现在从以上内容我只是想复制开始DEFINE;结束到目标文件即输出应该是段:

DEFINE variable as a1 expr= extract (n123f1 using brach, code); 

这需要做成千上万的脚本和多次出现,请大家帮帮忙。

非常感谢,所提供的代码有效,但在有限的程度上,只有当整个句子在一行中,但数据不应该在单行中时,它将以多行显示,如下所示:

/* This code is for lookup */ 
DEFINE variable as a1 expr= if branchno > 55 
then 
extract (n123f1 using brach, code) 
else 
branchno = null 
; 

END。

代码也以上述方式我需要DEFINE和分号(;)之间捕获所有的数据后,每限定会有一个结束分号;,这是图案。

+0

所有的都在一条线上? –

+0

多行传播。 – Bipin

+0

非常感谢大家。 – Bipin

回答

2

这听起来像你想grep(1)

grep '^DEFINE.*;$' input > output 
+0

命令中缺少文件输入 – jkshah

+0

@jkshah - 哎呀,谢谢。固定。 –

+0

我认为它不适用于多行案例,或者它? – Bentoy13

0

使用grep尝试。比方说,你有在目前的目录扩展.txt文件,

grep -ho 'DEFINE.*;' *.txt > outfile 

输出:

DEFINE variable as a1 expr= extract (n123f1 using brach, code); 

简要说明

-o会给你只匹配字符串,而不是整条生产线,如果线还包含其他内容并希望省略它。

-h会被你的终端上键入man grep匹配结果的grep

阅读man页面之前抑制的文件名

编辑

如果你想能力,多行搜索,你可以使用pcregrep-M选项

pcregrep -M 'DEFINE.*?(\n|.)*?;' *.txt > outfile 

在我的系统上正常工作。检查man pcregrep更多细节

参考:SO Question

+0

非常感谢上面的代码,但是在有限的程度上,只有当整个句子在一行中但数据不应该在一行中时,它是扩频在多个线象下面这样: /*该代码可用于查找*/ DEFINE变量作为A1 EXPR =如果branchno> 55 然后 提取物(n123f1使用BRACH,代码) 否则 branchno = NULL ; END。 代码也是以上述方式,我需要捕获DEFINE和分号(;)之间的所有数据,每次定义后都会有结尾分号; ,这是模式。 – Bipin

+0

@ipipin检查**编辑**在可能ans。如果您可以根据附加要求更新问题,这对于未来遇到此问题的人员会有所帮助。 – jkshah

+0

非常感谢好友。 – Bipin

0

一个可以使用sed配版的简单解决方案:

sed -n -e '/^DEFINE/{:a p;/;$/!{n;ba}}' your-file 

选项-n防止sed从印刷每一行;那么每当一行以DEFINE开始时,打印该行(命令p),然后输入一个循环:直到找到以;结尾的行,抓住下一行并循环到打印命令。退出循环时,你什么都不做。

它看起来有点脏;似乎版本sed15具有更短的(和更简单)的方式在一条线来实现:

sed -n -e '/^DEFINE/,/;$/p' your-file 

事实上,仅此版本的sed,两个图案进行处理;对于像我的cygwin下的sed其他版本,范围模式必须在单独的行上才能正常工作。

要记住的最后一件事:它不处理包含的图案范围,即即使在多个开始图案匹配的情况下,也会在第一次遇到的结束图案后停止打印。如果这是您正在寻找的功能,请使用awk

+0

感谢这一个工程。 – Bipin

相关问题