假设我有下面提到的代码。
module dut#(parameter type tp =int, tp x = 12 ) (int r , reg [7:0] rg);
endmodule
module mid (int r, reg [7:0] rg);
endmodule
module bin (int z, logix s);
endmodule
module med;
endmodule
我想提取单词dut
, mid
, bin
and med
,其特征是关键字之后module
和符号#
, (
or之前的单词;
,以先到者为准。
我想仅使用csh
脚本来完成此任务。哪个正则表达式可以用于此目的?
答案1
使用 (gnu)grep:
grep -Po 'module +\K\w+' file
答案2
另一种解决方案使用sed
:
$ sed -nE 's/^module +([^ (#;]+) *[#(;].*$/\1/p' filename
dut
mid
bin
s
这将通过用括号中的表达式替换 () 整行来提取模块名称。
现在,
- 它查找以“module”(
^module
)开头,后跟一个或多个空格(+
),然后是由一个或多个字符组成的字符串的行不是空间,(
或者#
,;
。该字符串被放置在“捕获组”中,因为其规范[^ (#;]+
被放置在括号内( ... )
。然后,正则表达式强制零个或多个空格 (*
),然后是 a#
、 a(
或 a;
([#(;]
),然后是任意数量的任意字符,直到行尾 (.*$
),以使行被视为匹配。 - 如果找到匹配项,则打印替换内容 (
p
),但该-n
选项确保默认情况下不打印不匹配的行。
如果你想了解更多关于正则表达式的知识,请看一下这里例如
答案3
我不确定你说的是什么意思only using csh script
。你能使用标准程序吗?如果是的话:
最简单的解决方案为我正在使用grep
和awk
。
grep "module \w*" -o filename | awk '{print $2}'
dut
mid
bin
答案4
和awk
:
$ awk -F'[ \t#(;]+' '/^module/{ print $2}' infile
dut
mid
bin
med
打印第二个字段,其中分隔符是 Space /Tab
\t
//#
或字符之一;
并(
忽略重复 ( +
)