2016-09-03 14 views
1

私はWebページをカールしようとすると、それにいくつかの処理を行い、最終的に私はJSON形式で印刷しようとしていますよ。のBashスクリプトの印刷出力

(実際にはMongoDBの入力にする必要があります)そう(カールかかわら読まれる)が入力される

入力:処理の種類について

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を生成している場合に改行がどこに気になるのですか?解析ツリーとドキュメントモデルの外観を気にする必要があります。要素間に空白の種類があるかどうかを気にする必要がある場合、コンシューマ(生成するコードを解析する者)はDoing It Wrongです。 –

+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([{"Name": "brendan"、 "Employer": "google"、 "Designation": "engineer"}、{"Name": "stones" "employer": "microsoft"、 "designation": "chief_engineer"}]) – Karthik

+0

あなたはどこに行きたいのか分かりません。私たちが印刷するテキストに追加するだけであれば、その変更は明らかです。 – tripleee

0

あなたは1.5以降をJQへのアクセスを持っている場合、あなたは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] }]' 
関連する問題