次の内容を含むテキストファイルがあります。
$ 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