特定の文字列の後に複数行があるかどうかを確認するには?

特定の文字列の後に複数行があるかどうかを確認するには?

次の出力を生成するスクリプトがあります。

URL:
 http://framework.com

Name(s):
 Patching Framework
----------------------------------------------------------

URL:
 http://asjkdfhn.com

Name(s):
 jadsbfkjdfhn dsjfkh
----------------------------------------------------------

URL:
 http://wusdh.com

Name(s):
 Wholesale Underwear dark health
----------------------------------------------------------
URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

複数の名前がリストされたURL/名前のみを印刷/エコーしたいです。

例:上記のURL /名前から以下を印刷してください。

URL:
 http://wertyuiioofn.com

Name(s):
 werthyeshfd asjfdhn
 ajdsfbndjfb dsjfhndjfhn
 dkfmdkfm dkfjkdjf
----------------------------------------------------------

URL:
 http://google.com

Name(s):
 Google
 Google, Phillipines
----------------------------------------------------------

bash / shellスクリプトを使用してこれを実行できますか?

ベストアンサー1

これはうまくいきます。このコマンドの後にファイル名を追加します。

sed -n '
       /URL:/{
              :addanotherrow
              N
              /-\{50,\}/bmatchandprint
              baddanotherrow
              :matchandprint
              /Name(s):[^\n]*\n[^-\n]*\n[^-]/p
              }
       '

いくつかの説明:

  • sedパラメーター「-n」は、パターンスペースの自動印刷を防ぎます。一致するパターンは、角括弧 {} 内のステートメントの最後の行の末尾に「p」を使用して印刷されます。
  • タグは前に「:」と表示されているため、「:addanotherrow」と「:matchandprint」は「b」ステートメントのジャンプポイントです。
  • bの後ろにラベルが付いている場合は、そのラベルに分岐するコマンド(GOTOと同様)。
  • N パターン空間に次の入力行を追加します。
  • 「/」で始まる行は、正規表現に従ってパターン空間を証明します。正規表現が適切な場合は、すでに述べたように次のコマンドを実行します。 b 分岐と p はパターン空間を印刷します。

つまり、文字列 "URL:" を検索すると、1 行が見つかるまでより多くの行が含まれます (1 行に少なくとも 50 個のハイフンを含む)。その後、収集された行(「パターンスペース」)を調べます。パターンスペースは、「name:」の行(ハイフンで始まらない)が2つ以上見つかった場合にのみ印刷されます。

役に立ったことを願っています:-)

おすすめ記事