Text-Processing

根據上面的線選擇線

  • August 12, 2018

我有一個項目列表,我想從中選擇活動項目的名稱:

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

由於大部分繁重的工作已經由 完成pcregrep,您現在可以將它傳遞給這個簡短的sed片段:

 sed -ne 'N;s/^Active\n//p'

這使得sed一次查看 2 行,而不是預設的 1 行。該N命令通過用換行符分隔將下一行粘貼到模式空間\n。現在,只有當 sed 能夠刪除模式空間中的 Active 第一行時,才會列印剩餘的模式空間。這是一個有條件的列印。Otw 什麼都沒有,並且-n應確保不自動列印圖案空間。HTH。

我認為您不能僅通過grep變體來做到這一點(誠然我不知道pcregrep)。嘗試awk

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

引用自:https://unix.stackexchange.com/questions/461848