1行から2つのキーワードの間に現れる単語を抽出する方法は? [コピー]

1行から2つのキーワードの間に現れる単語を抽出する方法は? [コピー]

下記のコードがあるとしましょう。

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を抽出したいと思います。midbinmedmodule#(;

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番目のフィールドを印刷し、重複を;無視(します(+)。

関連情報