ファイルがあり、ファイルデータに複数行に1単語しかありません。この状況が発生した場合は、次の行を現在の行に印刷したいと思います。
アドバイスを得ることができますか?
grep -E "module" filename # to fetch the line which contains the "module"
モジュールの後に文字列がない場合、2 行目はモジュール行の拡張として扱われます。
はい
module module_name1(i1,i2,i3)
statement1;
statement2;
statement3;
.
.
statement;
module
module_name2(i1,i2,i3) #observe here
statement1;
statement2;
statement3;
.
.
statement;
module module_name3(i1,i2,i3)
statement1;
statement2;
statement3;
.
.
statement;
module module_name4(i1,i2,i3)
statement1;
statement2;
statement;
.
.
statement;
期待される出力
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)
私が得た結果は何ですか?
module_name1(i1,i2,i3)
#missing
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)
次の行を現在の行と見なしたい場所がありません。
答え1
$ perl -ne 'if (s/^module\s*//) { $_ = <> if ($_ eq ""); s/\).*/)/; print }' file
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)
このperl one-linerは各入力行(-n
オプション)を読み取り、行の先頭から「module」という単語と末尾のスペースを削除しようとします。
成功したら、現在の行が空であることを確認してください。もしそうなら、次の行($_ = <>
)を読んでください。どちらも最初の)
文字()s/\).*/)/
の後のすべての内容を削除し、修正された行を印刷します。
ジョブが失敗した場合はs/^Module\s*//
何も印刷されず、スクリプトは次の入力行に進みます。
答え2
このような:
grep -A 1 "^module" < filename | sed -n -e 's/^\(module \)*\(.*(.*)\).*$/\2/p'
説明する:
grep ...
- 「モジュール」で始まる行フィルタリング
- 見つかった行と見つかった各行の後の行を返します。 (
-A 1
) 出力:
module module_name1(i1,i2,i3)
statement1;
--
module
module_name2(i1,i2,i3) #observe here
statement1;
--
...
sed ...
-n
:印刷しない(静止モード)-e
:スクリプトは次のとおりです。s/^\(module \)*\(.*(.*)\).*$/\2/p
: スクリプトs/.x./.y./.a.
:タグをタグ.x.
に.y.
置き換え/交換し、.a.
パラメータに従います。.x.
例^\(module \)*\(.*(.*)\).*$
:- 行の先頭(プレフィックス)で
module
トークン()を検索するかどうか。これは最初にマークされたパターンです。^
*
\(...\)
- 2番目のパターンは、ランダムな
\(...\)
文字.*
(あなたのモジュール名)とそれに続く角かっこ(...)
(バックスラッシュなし)で構成されています。あなたの場合、これはモジュールパラメータです。角かっこ間のすべての文字.*
.*
行の最後まですべての文字が続きます。$
- 行の先頭(プレフィックス)で
.y.
はい\2
- 括弧内の2番目のモード
.a.
はいp
p
強制印刷時に使用(-n
オプションではありません)され、.y.
印刷されます。
出力:
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)
答え3
短く:
$ grep -o 'module_name[0-9].*' file
module_name1(i1,i2,i3)
module_name2(i1,i2,i3)
module_name3(i1,i2,i3)
module_name4(i1,i2,i3)