2017-06-02 15 views
0

は、私は次のパターンで文字列を持っています。私はサブの除去でそれをやろうとしているが、代わりにBashの部分列除去

{x:1,action:PLAYING,name:John,description:Some description rSxv9HiATMuQ4wgoV2CGxw} 

を取得する私は、説明フィールド内の空白は、サブストリングを遮断するため

{x:1,action:PLAYING,name:John,description:Some} 

を得続けます。

変更するアイデアはありますか?

CODE:

string="000{x:1,action:PLAYING,name:John,description:Some description rSxv9HiATMuQ4wgoV2CGxw}401" 
string=$1 
string=$(echo "${string#*{}") 
string=$(echo "${string%}*}") 
string={$string} 
echo $string 
+0

あなたのJSONは '{...} 'というハッシュを内部に持っていますか? – codeforester

+0

私はあなたが示した結果が得られません。どのように引数をスクリプトに渡しますか? – choroba

+0

正確性にかかわらず、コマンド置換のためのサブシェルのパフォーマンスオーバーヘッドは少し残念です。 –

答えて

1

我々は、文字列の直接の割り当てを受け入れる場合、元のコードは、完璧に動作 - 次はもう少し明示的であるにもかかわらず:

string="000{x:1,action:PLAYING,name:John,description:Some description rSxv9HiATMuQ4wgoV2CGxw}401" 
string='{'"${string#*"{"}" # trim content up to and including the first {, and replace it 
string="${string%'}'*}"'}' # trim the last } and all after, and replace it again 
printf '%s\n' "$string" 

...正しく放出:

{x:1,action:PLAYING,name:John,description:Some description rSxv9HiATMuQ4wgoV2CGxw} 

私は、文字列が引用符で囲まれていないコマンドラインで渡されていると推測しているので、b複数の引数に分割する。呼び出しシェル(​​の代わりに./yourscript $stringではなく)による文字列分割を防ぐためにコマンドライン引数を引用すると、この問題は回避されます。 sedを持つ

+0

あなたは上記のあなたのコメントに正しかった。 '$ 1'だったので、それは打ち切られていました。ありがとう、トン!私はそれを受け入れることができるようにあなたの答えにそれを加えてください。 –

+0

@NishantRoy、完了、ありがとう。 –

0

string="000{x:1,action:PLAYING,name:John,description:Some description rSxv9HiATMuQ4wgoV2CGxw}401" 
sed 's/.*\({.*}\).*/\1/g' <<<$string 

出力:

{x:1,action:PLAYING,name:John,description:Some description rSxv9HiATMuQ4wgoV2CGxw} 
0

ここに行く...ところで

string="000{x:1,action:PLAYING,name:John,description:Some description rSxv9HiATMuQ4wgoV2CGxw}401" 
echo "original: ${string}" 
string="${string#*\{}" 
string="${string%\}*}" 
echo "final: {${string}}" 

は、JSONのキーは二重引用符で囲む必要があります。

関連する問題