Linux 将两个关键字内的节复制到目标文件中

Linux 将两个关键字内的节复制到目标文件中,linux,Linux,我在一个目录中有数千个文件,每个文件都包含许多定义的变量,这些变量以关键字DEFINE开始,以分号(;)结束。我希望将此关键字(包括)之间的所有数据复制到目标文件中 示例:下面是文本文件的内容: /* This code is for lookup */ DEFINE variable as a1 expr= extract (n123f1 using brach, code); END. 现在,从上面的内容中,我只想复制以定义开始,以结束的部分编码到目标文件中,即输出应为: DEFINE

我在一个目录中有数千个文件,每个文件都包含许多定义的变量,这些变量以关键字
DEFINE
开始,以分号(
)结束。我希望将此关键字(包括)之间的所有数据复制到目标文件中

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

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

END.
现在,从上面的内容中,我只想复制以
定义开始,以
结束的部分编码到目标文件中,即输出应为:

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
;
结束

代码也是以上述方式进行的,我需要捕获
定义
和分号(
)之间的所有数据,每次定义后都会有一个结束分号
,这是模式。

听起来你想要:


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

grep -ho 'DEFINE.*;' *.txt > outfile 
输出:

DEFINE variable as a1 expr= extract (n123f1 using brach, code);
简短描述

-o
将只提供匹配的字符串,而不是整行,前提是该行还包含其他内容并希望对其进行编辑

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

在终端上键入
man-grep
阅读grep手册页

编辑

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

pcregrep -M 'DEFINE.*?(\n|.)*?;' *.txt > outfile
在我的系统上运行良好。查看
man pcregrep
了解更多详细信息


参考资料:

可以使用
sed
和以下版本制作一个简单的解决方案:

sed -n -e '/^DEFINE/{:a p;/;$/!{n;ba}}' your-file
选项
-n
防止
sed
打印每一行;然后,每次一行以
DEFINE
开头时,打印该行(命令
p
),然后输入一个循环:直到找到以
结尾的行
,抓取下一行并循环到print命令。退出循环时,您什么也不做

看起来有点脏;似乎sed15的版本有一个更短(更直接)的方法来实现这一点:

sed -n -e '/^DEFINE/,/;$/p' your-file
事实上,只有对于这个版本的
sed
,两种模式都被处理;对于其他版本的
sed
,如cygwin下的我的版本,范围模式必须在单独的行上才能正常工作


最后要记住的一点是:它不处理包含图案的范围,即在遇到第一个结束图案后停止打印,即使多个开始图案已匹配。如果这是您正在寻找的功能,请选择带有
awk
的功能。

所有功能都在一行中?分散在多行中。非常感谢上面的代码工作正常,但仅在有限的范围内,当整个句子在一行中,但数据不应在一行中时,它被分散在多行中,如下所示:/*此代码用于查找*/将变量定义为a1 expr=如果branchno>55,则提取(n123f1使用brach,代码),否则branchno=null;结束。代码也是以上述方式编写的,我需要捕获DEFINE和分号(;)之间的所有数据在每次定义之后都会有一个结束分号,这就是模式。@Bipin Check EDIT in may ans。如果您可以使用附加要求更新问题,这样对将来遇到此问题的人会有帮助,那就太好了。如果数据是单行的,那么它才有效
sed -n -e '/^DEFINE/,/;$/p' your-file