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

How can I delete empty Verilog modules, using sed and xargs?

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

module noneed ;  
endmodule

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

grep -P -A 1 -n 'module \S+ \;' myfile.v \
  | perl -p -e 's/(\d+).*//' \
  | 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 ;  

在@Sundeep 的帮助下,我想到了这条超级快的线路。

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

谢谢

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

对于任何有单词边界 + module 且没有左括号的行,删除直到 endmodule。

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

一个可靠的解决方案是使用分号作为行分隔符。

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

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

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