Text-Processing
根據上面的線選擇線
我有一個項目列表,我想從中選擇活動項目的名稱:
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