如何使用sed和xargs删除空的Verilog模块?
我的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进行删除 我在这里做错
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