module_nameとinstance_nameを抽出したいVerilog / System Verilogファイルがあります。
次の1行から:
module_name#(.ANY_PARAMETER(.ANY_PARAMETER)、.ANY_PARAMETER_1(.ANY_PARAMETER_1))インスタンス名(.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
あなたのファイルは次の規則に従うようです。
- 各行には正確に3つのスペースが含まれています。
- モジュール名は、最初のスペースの前の名前です。
- インスタンス名は、2番目と3番目のスペースの間の名前です。
これが間違っている場合は、より良い説明とより良い例を提供するように質問を編集してください。
sed
使うsed
Substitute( s
) コマンドを使用すると、行の先頭から最初の空白まで実行される 1 つのキャプチャグループと、2 番目の空白から 3 番目の空白 (エンドポイントを除く) まで実行される 2 番目のキャプチャグループを使用して行全体を一致させることができますあります。次に、キャプチャされた2つの文字列を出力します。
sed 's/^\([^ ]* \)[^ ]* \([^ ]*\) .*/\1\2/'
PS実際に3つ以上のスペースがあり、インスタンス名が2番目から最後と最後の間にある場合は、代わりに次のようにします。
sed 's/^\([^ ]* \).* \([^ ]*\) .*/\1\2/'
pcregrep
同じロジック、異なるツール:
pcregrep -o1 -o2 '^([^ ]* )[^ ]* ([^ ]*) .*'
-o1 -o2
\1\2
.
同じPSが適用されます。