非常に大きなVerilogファイル(〜350MiB)があります。そこに特定のモジュール名を言及したいと思います。だから私はサンプルファイルをインポートして正規表現を使ってみました。
サンプルファイル(abc):-
module util_minor_rev_id(minor_rev);
output [3:0] minor_rev;
wire [3:0] minor_rev;
wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
(minor_rev[0]));
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1]));
xyz
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));
endmodule
HS55_LH_OPTALL_GND_Z
Untilを含む行をコメントアウトしたい;
ので、出力は次のようになります。
module util_minor_rev_id(minor_rev);
output [3:0] minor_rev;
wire [3:0] minor_rev;
wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
(minor_rev[0]));*/
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1]));*/
xyz
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));*/
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));*/
endmodule
まず、正規表現とgrepを使ってパターンを検証しました。複数行モードでの検索に問題があります。だからグーグルをしてみるとpcregrep
私の友人だった。
pcregrep -Mno '^\s\*HS55_LH_OPTALL_GND_Z.*(\n|.)+;$' abc
しかし、出力は次のとおりです。 -
5: HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
(minor_rev[0]));
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1]));
xyz
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));
7: HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1]));
xyz
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));
10:HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));
HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));
12: HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));
5行目から最後の行までが最初の試合だと思います;
。次に、7行目;
(セミコロン)まで入力します。その後、10行目から最後まで移動します;
。それから12行目から終わりまで;
私が望むように動作させるにはどうすればよいですか?
答え1
貪欲ではない一致を使用してください。
pcregrep -Mno '^\s*HS55_LH_OPTALL_GND_Z.*(\n|.)*?;$' file
出力:
5: HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
(minor_rev[0]));
7: HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1]));
10:HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));
12: HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));
Vimを使用して次の行にコメントを付けることもできます。
:%s!^\s*\zsHS55_LH_OPTALL_GND_Z\_.\{-};$!/* & */!
結果:
module util_minor_rev_id(minor_rev);
output [3:0] minor_rev;
wire [3:0] minor_rev;
wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
/* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
(minor_rev[0])); */
/* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1])); */
xyz
/* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2])); */
/* HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3])); */
endmodule
答え2
GNU sedの使用
これは目的の行をコメントアウトしたようです。
sed -z 's|HS55_LH_OPTALL_GND_Z[^;]*;|/*&*/|g' abc
たとえば、
$ sed -z 's|HS55_LH_OPTALL_GND_Z[^;]*;|/*&*/|g' abc
module util_minor_rev_id(minor_rev);
output [3:0] minor_rev;
wire [3:0] minor_rev;
wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
(minor_rev[0]));*/
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1]));*/
xyz
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));*/
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));*/
endmodule
この-z
オプション(GNUのみ)は、sedにファイルを一度に1行ずつ読み取るのではなく、NUL文字が見つかるまで読み取るように指示します。通常のテキストファイルにはNUL文字がないため、ファイル全体を一度に読み取る効果があります。
上記は、単一の代替コマンドを使用して関心のある線を配置して/*
囲みます。*/
現在の場所でファイルを変更するには:
sed -i.bak -z 's|HS55_LH_OPTALL_GND_Z[^;]*;|/*&*/|g' abc
他のsedを使用してください
BSD / OSXまたは他のsedの場合:
sed '/HS55_LH_OPTALL_GND_Z/{:a; /;/{bb}; N; ba; :b; s|H|/*H|; s|;|;*/|;}' abc
たとえば、
$ sed '/HS55_LH_OPTALL_GND_Z/{:a; /;/{bb}; N; ba; :b; s|H|/*H|; s|;|;*/|;}' abc
module util_minor_rev_id(minor_rev);
output [3:0] minor_rev;
wire [3:0] minor_rev;
wire n_15, n_16, n_17, n_18, n_19, n_20, n_21, n_22;
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id0(.A (1'b1), .Z
(minor_rev[0]));*/
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id1(.A (1'b1), .Z
(minor_rev[1]));*/
xyz
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id2(.A (1'b1), .Z
(minor_rev[2]));*/
/*HS55_LH_OPTALL_GND_Z opt_plug_minor_rev_id3(.A (1'b1), .Z
(minor_rev[3]));*/
endmodule
現在の場所でファイルを変更するには:
sed -i.bak '/HS55_LH_OPTALL_GND_Z/{:a; /;/{bb}; N; ba; :b; s|H|/*H|; s|;|;*/|;}' abc
制限事項:これらのsedコマンドはファイルを解析しないため、場合によっては間違った操作を実行することがあります。
どのように動作しますか?
/HS55_LH_OPTALL_GND_Z/{...}
これにより、含まれる行が選択され、
HS55_LH_OPTALL_GND_Z
その行に対して中括弧内のコマンドが実行されます。これらのコマンドを以下に説明します。:a
これはラベルを定義します
a
。/;/{bb}
パターンスペースに現在が含まれている場合は、
;
ラベルに分岐しますb
。N
ファイルから次の行を読み、パターンスペースに保存します。
ba
タグに分岐します
a
。:b
これはラベルを定義します
b
。s|H|/*H|; s|;|;*/|;
ここに到達すると、パターン空間が包含線で始まり
HS55_LH_OPTALL_GND_Z
包含線で終わるという意味です;
。このパターンスペースの場合は、/*
最初のものの前にaを、最初のものの後にH
aを置きます。*/
;