如何提取出现在一行中两个关键字之间的单词?

如何提取出现在一行中两个关键字之间的单词?

假设我有下面提到的代码。

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, binand 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。你能使用标准程序吗?如果是的话:

最简单的解决方案为我正在使用grepawk

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//#或字符之一;(忽略重复 ( +)

相关内容