下記のコードがあるとしましょう。
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
med
module
#
(
;
csh
スクリプトのみを使用してこれを実行したいと思います。この目的でどの正規表現を使用できますか?
答え1
(gnu)grepを使用してください:
grep -Po 'module +\K\w+' file
答え2
別の解決策は以下を使用しますsed
。
$ sed -nE 's/^module +([^ (#;]+) *[#(;].*$/\1/p' filename
dut
mid
bin
s
()行全体を括弧内の式に置き換えてモジュール名を抽出します。
今、
^module
「モジュール」()で始まり、1つ以上のスペース(+
)が続き、1つ以上の文字で構成される文字列を見つけます。スペースではない(
か#
、;
。文字列は、対応する仕様が[^ (#;]+
括弧内に配置されるため、「キャプチャグループ」に配置されます( ... )
。次に、正規表現は、ゼロ個以上の空白(*
)、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
\t
区切り文字がスペース/ Tab //#
または文字の1つである2番目のフィールドを印刷し、重複を;
無視(
します(+
)。