例如,网表是:提取特定的细胞从网表
INV i0 (.I(a0),
.O(b0));
BUF i1 (.I(a1),
.O(b1));
我想从网表提取BUF细胞并写入另一个文件。 正如你所知道的,网表的一个单元格内总是存在换行符,那么查找我想要提取的单元格的正则表达式格式是什么?
我试过grep ^BUF.*$
但它只会返回BUF i1 (.I(a1),
,因为有一个换行符,我没有提取整个BUF单元格。
例如,网表是:提取特定的细胞从网表
INV i0 (.I(a0),
.O(b0));
BUF i1 (.I(a1),
.O(b1));
我想从网表提取BUF细胞并写入另一个文件。 正如你所知道的,网表的一个单元格内总是存在换行符,那么查找我想要提取的单元格的正则表达式格式是什么?
我试过grep ^BUF.*$
但它只会返回BUF i1 (.I(a1),
,因为有一个换行符,我没有提取整个BUF单元格。
的grep溶液:
$ grep -Poz 'BUF[^;]+;' input.txt
BUF i1 (.I(a1),
.O(b1));
BUF i1 (.I(a1),
.O(b1));
AWK溶液:
$ cat vlg.awk
BEGIN { RS="" }
/BUF/
输入:
$ cat input.txt
INV i0 (.I(a0),
.O(b0));
BUF i1 (.I(a1),
.O(b1));
INV i0 (.I(a0),
.O(b0));
BUF i1 (.I(a1),
.O(b1));
输出:
$ awk -f vlg.awk input.txt
BUF i1 (.I(a1),
.O(b1));
BUF i1 (.I(a1),
.O(b1));
或只是命令行:$ awk 'BEGIN {RS=""} /BUF/' input.txt
Note:
在awk的解决方案,RS=""
和RS="\n\n+"
之间的差异应该注意。第一个选项忽略输入数据中的前导换行符,并且 - 如果文件在最后一条记录后没有多余的空行结束 - 最后的换行符将从记录中删除。使用第二个选项,这个特殊处理没有完成。请阅读gawk docs。二手评论由Ed Morton.`
您应该提到awk解决方案仅适用于GNU awk,原因是多字符RS。对于他们在任何awk中改变'RS =“\ n \ n”'到'RS =“”'。而且,在awk'/ BUF/{print $ 0}中''通常写成只是'/ BUF /',因为'{print $ 0}'是给定真实条件的默认动作。如果您可以输出多个记录,则还应该设置ORS =“\ n \ n”'以匹配输入的空行分隔格式。 –
您应该提到'RS =“”'会导致输入数据文件中的前导换行被忽略,并且如果文件在最后一条记录后没有多余的空行结束,则最后的换行符将从记录中删除。 Ergo:这是+1。明确的印刷应该去,我同意。 'ORS =“\ n \ n”'加法是一个假设。 –
如果在文件开始时有任何完全空行,那么是的,他们会被忽略,但a)他们为什么会在那里和b)如果他们是那么为什么不应该忽略它们?c)段落的行为模式已经有很好的文档记录,并且与使用默认FS时忽略记录中的前导空白的方式一致 - 每次使用时都不需要描述。以空行结尾的文件不会导致最终的换行符被删除。是的,我们必须假设OP是否希望在输出记录之间插入新行,例如在他的输入中。 –
随着SED:
sed -n '/^BUF/{N;p}' file
当^BUF
发现,该行合并下一行(N
)和输出(p
)。
grep的 oneliner
grep "BUF " -A1 input >> output
对于每一个BUF
比赛,打印匹配行和后一行。
输出文件:
BUF i1 (.I(a1),
.O(b1));
这将任何UNIX系统上的任何AWK稳健运行:
awk -v RS= '$1=="BUF"' file
,如果你能在输入有多个“BUF”块,那么你就可能需要输入中的空白行与输入中的空行相同,然后您可以使用:
awk -v RS= -v ORS='\n\n' '$1=="BUF"' file
上述和其他答案之间的主要区别在于,由于它对每个记录中的第一个非空字符串进行精确的字符串比较,它将工作,不管在行上的BUF之前是否有空格,即使相似的文本(例如BUFFER)出现在其他行上,并且即使BUF出现在文件其他部分的错误位置(例如注释中)也可以工作。
例如与该输入文件:
$ cat file
INV i0 (.I(a0), # not BUF here
.O(b0));
BUF i1 (.I(a1),
.O(b1));
BUFFER i1 (.I(a1),
.O(b1));
这里是如何的所有提出的解决方案迄今的行为:
$ awk -v RS= '$1=="BUF"' file
BUF i1 (.I(a1),
.O(b1));
$
$ sed -n '/^BUF/{N;p}' file
BUFFER i1 (.I(a1),
.O(b1));
$
$ awk 'BEGIN {RS=""} /BUF/' file
INV i0 (.I(a0), # not BUF here
.O(b0));
BUF i1 (.I(a1),
.O(b1));
BUFFER i1 (.I(a1),
.O(b1));
$
$ grep -Poz 'BUF[^;]+;' file
BUF here
.O(b0));BUF i1 (.I(a1),
.O(b1));BUFFER i1 (.I(a1),
.O(b1));$
$
$ grep "BUF " -A1 file
INV i0 (.I(a0), # not BUF here
.O(b0));
--
BUF i1 (.I(a1),
.O(b1));
$
正确解析的Verilog,使用https://metacpan.org/ pod/Verilog-Perl – toolic