我在目录中有数千个文件,每个文件包含以关键字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);
这需要为成千上万的脚本和多次出现完成,请帮帮忙。
非常感谢,提供的代码可以正常工作,但是只有当整个句子在一行中但数据不应该在一行中时,它才会在有限的范围内传播,如下所示:/ p>
/* 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 :(得分: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
修改强>
如果您希望能够多行搜索,可以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
的内容。