上記の行に基づいて行を選択

上記の行に基づいて行を選択

アクティブなプロジェクトの名前を選択したいプロジェクトのリストがあります。

item {
  status: "Active"
  properties {
    key_a: value
  }
  id: 42
  name: "Foo"
}
item {
  status: "Disabled"
  properties {
    key_b: value
  }
  id: 12
  name: "Bar"
}
item {
  status: "Active"
  id: 2
  name: "Baz"
}

キャプチャグループを使用して名前を抽出できることを知っていますpcregrep

$ cat list.txt | pcregrep -o1 -i '^  name: "(.*)"'
Foo
Bar
Baz

OR式を使用すると、重複した状態値と名前のリストを取得することもできます。

$ cat list.txt | pcregrep -o2 -i '^  (status|name): "(.*)"'
Active
Foo
Disabled
Bar
Active
Baz

最後に、前の行に基づいてリストの名前をフィルタリングする必要があります。どうすればいいですか?

最終出力は次のようになります。

Foo
Baz

ベストアンサー1

バリエーションだけではこれを行うことができないと思いますgrep(もちろんわかりませんpcregrep)。努力するawk

awk '/^ *status.*Active.$/ {ACT = 1} /^ *name:/ && ACT {gsub (/"/, "", $2); print $2; ACT = 0}' file
Foo
Baz

おすすめ記事