2016-09-03 217 views
1

我試圖捲曲網頁,並做了一些處理,並在最後我試圖以JSON格式打印。(這實際上需要在MongoDB中輸入)bash腳本打印輸出

所以輸入(這是讀儘管捲曲)是

輸入:

brendan google engineer 
stones microsoft chief_engineer 
david facebook tester 

的那種處理的,我的變量($名稱,$ emloyer,$名稱)分配值

我的最後命令,該命令轉換成JSON是,

echo [{\"Name\":\"$name\"},{\"Employer\":\"$employer\"},{\"dDesignation\":\"$designation\"}] 

電流輸出是,

[{"Name":"brendan","Employer":"google","Designation":"engineer"}] 
[{"Name":"stones","Employer":"microsoft","Designation":"chief_engineer"}] 
[{"Name":"david","Employer":"facebook","Designation":"tester"}] 

但是,我想在同一行中輸出由逗號和方括號中分離(不在每行)

預期輸出:

[{"Name":"brendan","Employer":"google","Designation":"engineer"},{"Name":"stones","Employer":"microsoft","Designation":"chief_engineer"}, 
    {"Name":"david","Employer":"facebook","Designation":"tester"}] 

有任何建議。

+1

爲什麼你在意如果你生成JSON是換行符?你應該關心分析樹和文檔模型是什麼樣子 - 如果你需要關心元素之間的空白是什麼樣的,那麼你的消費者(解析你生成的代碼的人)就是做錯了。 –

+0

......特別是,MongoDB *絕對不會在意在語法相關位置(如字符串內容)之外是否有換行符或空格。 –

回答

5

傳統的文本處理工具無法爲一般情況做到這一點。例如,JSON有很多特殊情況 - 不可打印和高Unicode字符(和引號)需要轉義。使用這實際上這項工作建立了一個工具,如jq


jq -n -R ' 
[ 
    inputs | 
    split(" ") | 
    { "Name": .[0], "Employer": .[1], "Designation": .[2] } 
]' <<EOF 
brendan google engineer 
stones microsoft chief_engineer 
david facebook tester 
EOF 

...發射作爲輸出:

[ 
    { 
    "Name": "brendan", 
    "Employer": "google", 
    "Designation": "engineer" 
    }, 
    { 
    "Name": "stones", 
    "Employer": "microsoft", 
    "Designation": "chief_engineer" 
    }, 
    { 
    "Name": "david", 
    "Employer": "facebook", 
    "Designation": "tester" 
    } 
] 
+0

Perfecto !!如果你有另一個選擇,你會建議什麼工具? – sjsam

+2

如果安裝jq不是一個選項,我平常的回退就是嵌入一段Python代碼,因爲那裏有一個非常出色的json模塊。 –

+0

我雖然關於perl,但是現在jq在這些日子裏更容易被使用,我想。無論如何,很好的答案++ – sjsam

1

像這樣的事情?

sep='[' 
curl "...whatever..." | 
while read -r name employer designation; do 
    printf '%s{"Name": "%s", "Employer": "%s", "Designation": "%s"}' "$sep" "$name" "$employer" "$designation" 
    sep=', ' 
done 
printf ']\n' 

我確實認爲這很脆弱且容易出錯;如果您可以使用像jq這樣的JSON感知工具,那麼請務必這樣做。

+0

@CharlesDuffy確實,鍵入,沒有想到 - 現在修復,感謝診斷! – tripleee

+0

@tripleee這實際上工作得很好,可以寫成mongodb查詢嗎? 它會像 db.testcollection.insert([{ 「名稱」: 「布蘭登」, 「僱主」: 「谷歌」, 「稱號」: 「工程師」},{ 「名稱」: 「寶石」, 「僱主」:「微軟」,「指定」:「chief_engineer」}]) – Karthik

+0

不知道你想要去哪裏。如果您只是想將它添加到我們打印的文本中,則更改應該很明顯。 – tripleee

0

如果您有機會獲得JQ 1.5或更高版本,那麼你可以使用inputs不妨考慮使用splits(" +")的情況下,令牌可能由一個以上的空格分開:

jq -n -R ' 
    [inputs 
    | [splits(" +")] 
    | { "Name": .[0], "Employer": .[1], "Designation": .[2] }]' 

如果你不這樣做已準備好訪問jq 1.5或更高版本,那麼請注意以下內容將與jq 1.4配合使用:

jq -R -s ' 
    [split("\n")[] 
    | select(length>0) 
    | split(" ") 
    | { "Name": .[0], "Employer": .[1], "Designation": .[2] }]'