如何使用sed和xargs删除空的Verilog模块?

时间:2018-01-23 10:16:17

标签: sed xargs

我的Verilog文件中有空模块(自动写入),我想在写入文件时将其删除 e.g。

module noneed ;  
endmodule

我的计划是找到这些行并将其从我的文件中删除,所以我想出了这个(非工作)管道:

grep -P -A 1 -n 'module \S+ \;' myfile.v \
  | perl -p -e 's/(\d+).*/$1/' \
  | grep -v '-' \
  | xargs -0 -i sed '{}d' myfile.v

我的专栏:找到空模块,记下他们的行号(以及后面的行)并将其提供给sed以便删除。

我在这里做错了什么?我如何修理我的单线以实际删除线?

顺便说一句, xargs很酷,但是我并不关心不使用它的解决方案。

修改
这是测试文本:

buf syn_1 ( .a ( clkin ) , .vcc ( vcc ) ,  .vss ( vss ) ) ;  
endmodule  
module some_bu11shit_module_nobody_needs_234 ;  
endmodule  
module a_real_module ( clk , inputs , vcc , vss ) ;  
input  clk ;  

EDIT2
期望的输出:

buf syn_1 ( .a ( clkin ) , .vcc ( vcc ) ,  .vss ( vss ) ) ;  
endmodule  
module a_real_module ( clk , inputs , vcc , vss ) ;  
input  clk ;  

2 个答案:

答案 0 :(得分:1)

sed -e '/\bmodule[^(]*$/,/endmodule/d' myfile.v

对于任何带有单词边界+ module并且没有打开的parens的行,请删除直到endmodule。

有效删除没有引脚的模块,用于格式化Verilog的典型方法。

强大的解决方案将使用分号作为行分隔符。

那就是说,这是我们使用的/START/,/END/{ ... }语法,有很多编辑网表:

sed \
    -e '/\.SUBCKT DELETEME\b/,/\.ENDS/d' \
    -e '/module DELETETHISTOO\b/,/endmodule/d' \
    input-file > output-file

...因为即使spice可以有行连续,并且verilog可以在分号之前有任意换行符,但大多数网表工具都可以被告知避免那些更困难的情况。

答案 1 :(得分:0)

在@Sundeep的帮助下,我想出了这条超快速的线。

sed -i -re '/module \S+ ;/,+1d' myfile.v

由于