将两个关键字中的部分复制到目标文件中

时间:2013-10-17 18:48:24

标签: linux

我在目录中有数千个文件,每个文件包含以关键字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和分号(;)之间的所有数据,每次定义后都会有一个结束分号;,这是模式。

3 个答案:

答案 0 :(得分:2)

听起来你想要grep(1)

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

答案 1 :(得分:0)

尝试使用grep。假设您在当前目录中有扩展名为.txt的文件,

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

输出:

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

简短说明

-o只会给你匹配的字符串而不是整行,如果line也包含其他内容并且想要省略它。

-h将在匹配结果

之前禁止文件名

在终端上输入man grep

,阅读grep的手册页

修改

如果您希望能够多行搜索,可以pcregrep使用-M选项

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

在我的系统上运行正常。查看man pcregrep了解详情

参考:SO Question

答案 2 :(得分: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,才会处理这两种模式;对于其他版本的sed喜欢我的cygwin,范围模式必须在不同的行上才能正常工作。

最后要记住的事情是:它不处理包含图案的范围,即即使已经匹配多个起始模式,它也会在第一个遇到的结束模式之后停止打印。如果这是您正在寻找的功能,请选择awk的内容。