2013-08-28 38 views
0

我有幾個線若干塊,可能看起來像這樣的文本文件:解析逗號分隔的「鍵:值」字符串

{ key1: value, key2: value, 
    key3: value, 
    key4: value, key5: value } 

{ key1: value, key2: value, key3: value, 
    key4: value, key5: value } 

給定一個key,我怎麼可以得到所有的對應值? 請注意,鍵名稱和值都不是固定長度,塊的開始和結束都使用大括號,而對使用逗號分隔。

我的第一次嘗試是與grepcut,但我無法得到所有的關鍵。我想這應該很容易與sedawk,但他們的語法讓我很困惑。

+1

你試圖解析[JSON](http://en.wikipedia.org/wiki/JSON)嗎? – devnull

+0

看起來像'json'。 ruby/python/perl/...有解析它的軟件包。 http://stackoverflow.com/questions/1955505/parsing-json-with-sed-and-awk這可能是你在找什麼,雖然我不會使用bash(或額外的utils)這個... –

+0

不,這是一個yaml文件。我沒有找到一個方便的工具來解析一個大的yaml文件(實際上我有兩個,但他們無法讀取整個文件)。由於我只需要這些領域,我認爲bash是一個不錯的選擇。 – ChronoTrigger

回答

3

首先要解決的關鍵:

grep -o 'key5: [^, }]*' file 

顯示索姆eting像:

key5: value 
key5: value 

要刪除的鍵:

grep -o 'key5: [^, }]*' file | sed 's/^.*: //' 

value 
value 
+0

我意識到當輸入'key5'時,我得到'value}'。如何避免支撐? – ChronoTrigger

+1

@ChronoTrigger你的值只能包含數字嗎?我更新了它,以排除括號'}'和空格。 – konsolebox

1

這隻能如果該鍵和值都在同一條線上,如果密鑰不包含在任何價值,如果值和鍵不包含空格,逗號或冒號:

awk -F'[, :]+' '{for (i=1;i<NF;i++) if ($i=="key3") print $(i+1)}' file 

或者,如果你從使用grep可變

awk -F'[, :]+' -v key="$key" '{for (i=1;i<NF;i++) if ($i==key) print $(i+1)}' file 
1

使用sedgrep

sed 's|[{},]|\n|g' your-file.txt | grep -Po '(?<=key1:).*$' 

sed重新格式化文件以對每行只有一對鍵值;然後使用grep和lookbehind來僅提取與指定鍵相關的值。