2017-09-01 107 views
0

例如,网表是:提取特定的细胞从网表

INV i0 (.I(a0), 
    .O(b0)); 

BUF i1 (.I(a1), 
    .O(b1)); 

我想从网表提取BUF细胞并写入另一个文件。 正如你所知道的,网表的一个单元格内总是存在换行符,那么查找我想要提取的单元格的正则表达式格式是什么?

我试过grep ^BUF.*$但它只会返回BUF i1 (.I(a1),,因为有一个换行符,我没有提取整个BUF单元格。

+0

正确解析的Verilog,使用https://metacpan.org/ pod/Verilog-Perl – toolic

回答

1

的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.`

+1

您应该提到awk解决方案仅适用于GNU awk,原因是多字符RS。对于他们在任何awk中改变'RS =“\ n \ n”'到'RS =“”'。而且,在awk'/ BUF/{print $ 0}中''通常写成只是'/ BUF /',因为'{print $ 0}'是给定真实条件的默认动作。如果您可以输出多个记录,则还应该设置ORS =“\ n \ n”'以匹配输入的空行分隔格式。 –

+0

您应该提到'RS =“”'会导致输入数据文件中的前导换行被忽略,并且如果文件在最后一条记录后没有多余的空行结束,则最后的换行符将从记录中删除。 Ergo:这是+1。明确的印刷应该去,我同意。 'ORS =“\ n \ n”'加法是一个假设。 –

+0

如果在文件开始时有任何完全空行,那么是的,他们会被忽略,但a)他们为什么会在那里和b)如果他们是那么为什么不应该忽略它们?c)段落的行为模式已经有很好的文档记录,并且与使用默认FS时忽略记录中的前导空白的方式一致 - 每次使用时都不需要描述。以空行结尾的文件不会导致最终的换行符被删除。是的,我们必须假设OP是否希望在输出记录之间插入新行,例如在他的输入中。 –

1

随着SED:

sed -n '/^BUF/{N;p}' file 

^BUF发现,该行合并下一行(N)和输出(p)。

0

grep的 oneliner

grep "BUF " -A1 input >> output 

对于每一个BUF比赛,打印匹配行和后一行。

输出文件:

BUF i1 (.I(a1), 
    .O(b1)); 
0

这将任何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)); 
$