Linuxコマンドを使用して単語を検索するスクリプト

Linuxコマンドを使用して単語を検索するスクリプト

ファイルがあり、ファイルデータに複数行に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'

説明する:

  1. grep ...
  • 「モジュール」で始まる行フィルタリング
  • 見つかった行と見つかった各行の後の行を返します。 ( -A 1) 出力:
module module_name1(i1,i2,i3)
statement1;
--
module
module_name2(i1,i2,i3)   #observe here
statement1;
--
...
  1. 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)

関連情報