次の出力を生成するスクリプトがあります。
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つ以上見つかった場合にのみ印刷されます。
役に立ったことを願っています:-)
答え2
sed -n '
/URL:/{
:1 #return point
N #append next line
/-{20,}/!b1 #go to return point while reach ---
/Name(s):\n[^\n]\+\n[^-]/p #check if more 1 line after «Name(s)»
}
'