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

如何使用sed和xargs删除空的Verilog模块?,sed,xargs,Sed,Xargs,我的Verilog文件中有空模块(自动写入),我想在写入文件时删除这些模块。 e、 g modulenoneed; 端模 我的计划是找到这些行并将其从文件中删除,因此我提出了以下(非工作)管道: grep-P-a1-n'module\S+\;'myfile.v\ |perl-p-e的/(\d+).*/$1/'\ |grep-v'-'\ |xargs-0-i sed'{}d'myfile.v My line:查找空模块,获取它们的行号(以及后面的行号),并将其馈送到sed进行删除 我在这里做错

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

modulenoneed;
端模
我的计划是找到这些行并将其从文件中删除,因此我提出了以下(非工作)管道:

grep-P-a1-n'module\S+\;'myfile.v\
|perl-p-e的/(\d+).*/$1/'\
|grep-v'-'\
|xargs-0-i sed'{}d'myfile.v
My line:查找空模块,获取它们的行号(以及后面的行号),并将其馈送到
sed
进行删除

我在这里做错了什么?我如何修复我的一个衬里以实际移除这些管线

顺便说一句,
xargs
很酷,什么都有,但我不喜欢不使用它的解决方案

编辑
这里有一个测试文本:

EDIT2
所需输出:


在@Sundeep的帮助下,我想出了这句话,它做得非常快

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

谢谢

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

对于任何具有单词边界+
模块
且无打开参数的行,请删除,直到endmodule

有效地删除了没有引脚的模块,这是格式化Verilog的典型方式

一个健壮的解决方案将使用分号作为行分隔符

也就是说,这是我们在编辑网络列表时使用的
/START/,/END/{…}
语法:

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

…因为即使spice可以有换行符,verilog可以有任意的换行符,直到分号为止,大多数网络列表工具都可以被告知避免这些更困难的情况。

您似乎已经在使用Perl了。为什么不使用呢?从未使用过它(或者直到现在才听说过它).无论如何,我的目标是一个单行程序,我不知道如何在单行程序中使用CPAN。see的可能副本也支持GNU sed
\S
,所有POSIX工具都支持
[^[:space:]
。您可以使用
[a-zA-Z0-9]
如果这些是允许的有效字符,您的答案似乎是有效的,但没有起到作用。ls-l myfile.v…65363912…myfile.v sed-e'/module[^(]*$/,/endmodule/d'myfile.v ls-l myfile.v…65363912…myfile.v对于一些扩展的测试用例来说效果更差。需要行起始锚(
^
)或者在
module
前面加一个单词边界(
\b
),或者它匹配每个endmodule行。希望现在对您有用。
buf syn_1 ( .a ( clkin ) , .vcc ( vcc ) ,  .vss ( vss ) ) ;  
endmodule  
module a_real_module ( clk , inputs , vcc , vss ) ;  
input  clk ;  
sed \
    -e '/\.SUBCKT DELETEME\b/,/\.ENDS/d' \
    -e '/module DELETETHISTOO\b/,/endmodule/d' \
    input-file > output-file