![从 verilog/System Verilog 文件中提取模块名称和实例名称](https://linux22.com/image/12630/%E4%BB%8E%20verilog%2FSystem%20Verilog%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8F%90%E5%8F%96%E6%A8%A1%E5%9D%97%E5%90%8D%E7%A7%B0%E5%92%8C%E5%AE%9E%E4%BE%8B%E5%90%8D%E7%A7%B0.png)
我有一个 verilog/System Verilog 文件,我只想从中提取 module_name 和 instance_name。
来自以下单行:
module_name #(.ANY_PARAMETER(.ANY_PARAMETER),.ANY_PARAMETER_1(.ANY_PARAMETER_1)) instance_name (.any_connection(any_connection));
输出应该只是:
模块名称 实例名称
我怎样才能做到这一点?
答案1
我们需要recursive regex
处理这种平衡+嵌套大括号的情况。
我们首先制作一个正则表达式$r
,它以括号“(”开始,然后查找非括号内容(可能因为 * 而不存在),然后再次递归非括号内容,最后是平衡右括号。
$ perl -lne '
$r = qr/\( [^()]* (?:(??{ $r }) [^()]*)* \)/x;
print $1 =~ y/\t #//dr while /\G([^()]*) $r/xg;
' file.sv
结果:
module_name
instance_name
答案2
命令 。
awk '{for(i=1;i<=NF;i++){if (($i ~ /module/)||($i ~ /instance/)) print $i}}' filename
输出
module_name
instance_name
答案3
您的文件似乎遵循以下规则:
- 每行恰好包含三个空格。
- 模块名称是第一个空格之前的名称。
- 实例名称是第二个和第三个空格之间的任何名称。
如果这是不正确的,请编辑您的问题以提供更好的解释和更好的示例。
sed
用一个sed
substitute ( s
) 命令来匹配整行,其中一个捕获组从行的开头向上穿过第一个空格,第二个捕获组从第二个空格运行到第三个空格(不包括端点)。然后输出捕获的两个字符串:
sed 's/^\([^ ]* \)[^ ]* \([^ ]*\) .*/\1\2/'
PS 如果实际上有超过三个空格,并且实例名称在倒数第二个和最后一个之间,则改为:
sed 's/^\([^ ]* \).* \([^ ]*\) .*/\1\2/'
pcregrep
相同的逻辑,不同的工具:
pcregrep -o1 -o2 '^([^ ]* )[^ ]* ([^ ]*) .*'
-o1 -o2
相当于\1\2
.
同样的后记也适用。