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
;

结尾。

代码也采用上述方式,我需要在每次定义后捕获DEFINE分号 ( ;) 之间的所有数据,这将是一个结束分号;,这就是模式。

4

3 回答 3

2

听起来你想要grep(1)

grep '^DEFINE.*;$' input > output
于 2013-10-17T18:50:58.827 回答
0

sed可以使用with version制作一个简单的解决方案:

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如果这是您正在寻找的功能,则更喜欢。

于 2013-10-18T13:11:09.833 回答
0

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

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

输出:

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

简短的介绍

-o如果 line 还包含其他内容并且想要省略它,则只会为您提供匹配的字符串而不是整行。

-h将在匹配结果之前抑制文件名

man grep通过在终端上键入来阅读 grep 的手册页

编辑

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

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

在我的系统上运行良好。查看man pcregrep更多详情

参考:所以问题

于 2013-10-17T19:07:33.817 回答