2016-08-03 216 views
0

我不理解sed,awk或grep - 我嘗試了最後3個小時得到結果,但是我沒有得到正確的答案。bash從長字符串中獲取值

我有什麼: 我從icloud.com

{u'timeStamp': 1470252602355, u'locationFinished': True, u'longitude': XX.XXXXXXXXXXXXX, u'positionType': u'GPS-Course', u'locationType': None, u'latitude': XX.XXXXXXXXXXXXX, u'isOld': False, u'isInaccurate': False, u'horizontalAccuracy': 200.0} 

這個信息,這是我的iphone的位置。

但我只需要緯度和經度。我試着用AWK,sed和grep - 我沒有成爲正確的結果。

+0

在一般情況下,你不能依靠任何工具來解析JSON,因爲它們都是面向行的,你無法預測換行符可能出現在JSON 。使用專爲JSON設計的工具(如答案中提到的'jsawk'和'jq'),或者使用一種語言(例如Python),該語言具有用於解析JSON的庫。 – chepner

+0

雖然,你究竟如何得到這個結果呢?這看起來更像是一個Python'dict'的字符串表示,可能是解析JSON的結果。 – chepner

回答

0

在這裏你去...

$ tr ',' '\n' <file | grep '\(lati\|longi\)tude' 
u'longitude': XX.XXXXXXXXXXXXX 
u'latitude': XX.XXXXXXXXXXXXX 

,或者不tr

$ grep -o '\(lati\|longi\)tude[^,]*' file 
longitude': XX.XXXXXXXXXXXXX 
latitude': XX.XXXXXXXXXXXXX 
1

在sed(其中a.json是您的文件),將打印只是經度值和緯度值):

sed "s/.*u'longitude': \([^,]\+\).*u'latitude': \([^,]\+\).*/\1 \2/g" a.json 
+0

謝謝!這正是我需要的。我發誓,我會更多地閱讀有關表情的文章... – schmucke

1

看上去像一個JSON。你可以使用jsawk解析它,我沒有使用它,但看起來它會很容易解決你的問題。

echo "your json string" | jsawk "this.latitude" 

注意:這會給出答案(謝謝sjsam)。如果json字符串變化,處理正則表達式可能會變得更加複雜。所以更好地處理這個字符串作爲json而不是普通的字符串。

+1

@sjsam是的,真的,我編輯了我的答案。 – Devavrata

1

這grep的管道將阻攔這些領域:

grep -o "'l[^:]\+itude':[^,]\+"

0

jsawk,你可以使用jq進行處理您的JSON:

json="{u'timeStamp': 1470252602355, u'locationFinished': True, u'longitude': XX.XXXXXXXXXXXXX, u'positionType': u'GPS-Course', u'locationType': None, u'latitude': XX.XXXXXXXXXXXXX, u'isOld': False, u'isInaccurate': False, u'horizontalAccuracy': 200.0}" 
echo "$json" | jq '.latitude' 
0
$ awk -v RS=',' -F'[\n:][[:space:]]*' '{for (i=1;i<NF;i++) if ($i ~ /(lat|long)itude/) print $(i+1) }' file 
XX.XXXXXXXXXXXXX 
XX.XXXXXXXXXXXXX