sed/awk を使用した YAML ファイルのコンテンツのフィルタリング

sed/awk を使用した YAML ファイルのコンテンツのフィルタリング

次の内容を含むテキストファイルがあります。

$ cat hosts.yml
[prod_env]
foo.example.com
bar.example.com
[stage_env]
foo_stage.example.com
bar_stage.example.com
[dev_env]
foo_dev1.example.com
dev2_bar.example.com

Bashの[prod_env]ファイルの下にリストされているホストをフィルタリングしたいと思います。私は限られた知識でsed、awk、およびgrepを試しましたが、フィルタリングする方法がわかりません。

例:prod_envとdev_envの下のホストを印刷したいと思います。したがって、最終出力は次のようになります。

foo.example.com 
bar.example.com 
foo_dev1.example.com 
dev2_bar.example.com

ベストアンサー1

解決策sed

sed -nEe '/\[(prod|dev)_env]/!d;N;:loop' -e 's/.*\n//;${p;d;};N;P;/\n\[/D;bloop' hosts.yml
  • /\[(prod|dev)_env]/!d[prod_env]検索[dev_env]または検索されるまですべての行を削除
  • N;:loop次の行を追加して繰り返し開始
  • ループ内の2行のうち最初の行を削除します。s/.*\n//これ[...env]は、縮小または最後のループサイクルですでに印刷されているためです。
  • ${p;d;}印刷中に最後の行に達すると、残りの行が印刷されます。
  • N;P次の行を追加して現在の行を印刷する
  • /\n\[/D次の行がで始まることを確認してください[。この場合、バッファの最初の行(印刷された)を削除でき、[その行から始まります。
  • bloopそうでなければループ

バッファに次の行を追加し、前の行を印刷して削除するのではなく、1行ずつ実行できますが、再起動できないため、別のループが必要です。D

おすすめ記事