私は他の答えを見ましたが、これを行う方法の適切な説明を得ることはできません。
という文字列id
変数がありますid='{"name":"john"}'
。この文字列では、次の2つの変数をどのように取得できますか?
key="name"
value="john"
bashの文字列の解析を理解したいので、詳細な説明をありがとう。
これまで、{}
文字列から中括弧を削除しました。
id="$( echo "${id}" | tr -d {} )"
"
エラーが発生したため、そこに含めることはできません。まだ似たようなものを探していて、id.split(":")
最終的に配列で終わりました。
答え1
あなたがこれを要求したので、understand string parsing in bash
それを念頭に置いて答えを書きます。問題の解決策が間違っています。。 bash自体を使用して必要なものを実行できます。もしあなたは本当にきれいです。特殊文字のないデータ特別な以下以外と定義されます[A-Za-z0-9 ]
。
$ id='{"name":"john"}'
$ id="${id#*\{}" # remove everything through the first '{'
$ echo $id
"name":"john"}
$ id="${id%\}*}" # remove everything starting with the last '}'
$ echo $id
"name":"john"
$ name="${id%:*}" # take everything before the ':'
$ name="${name//\"/}" # remove quotes
$ echo $name
name
$ value="${id#*:}" # take everything after the ':'
$ value="${value//\"/}" # remove quotes
$ echo $value
john
これは「パラメータ拡張」で説明されています。バッシュマニュアル。たとえば、${parameter#word}
これにより、先頭からテキストが削除されますRemove matching prefix pattern
。同様に、サフィックスを削除します。文字列のすべての項目を次の項目に置き換えます(上記の例では、引用符(表示されるようにエスケープする必要があります)は空の文字列に置き換えられます)。ただし、各交換を個別に行う必要があります。先頭を削除することはできません。word
$parameter
%
//
${foo//\"/}
\"
そしてコマンドで文字列を終了します。
}
など{
の特殊文字をエスケープする必要があることがわかります"
。正しく行うことを覚えている限り、次のことができます。書くこのようなコードは書くのは簡単ですが、単純さにもかかわらず、単にコードを書く傾向があります。 1〜2年後にこのコードを再利用して再利用すると、次のような内容を見て#*\{}
自分で考えることになります。これはどういう意味ですか?その後、盲目的に新しいプロジェクトにコピーすると、予期しない特殊文字が表示されるため、コードは微妙な方法で中断されます。
上記の例は、名前と値のペアに中括弧、エスケープされた引用符、コロンなどの特殊文字またはその他の文字が含まれている場合は中断されます。したがって、これは迅速で汚れたスクレイピングや80%のユースケースに効果的ですが、本番やすべての入力に対して常に機能していることを確認する必要がある場合は、実際には使用しないでください。
echo
何が起こっているのかを示すステートメントがなくても、このコードが正しく実行される方法を示す他の答えの例よりもすでに長いことがわかります。したがって、サードパーティ製のツールを使用しないと、より多くのコードを書く必要があり、作成とデバッグに時間がかかり、最終的に柔軟性の低いソリューションを使用することになります。〜する予期しないことが起こると崩れます。
答え2
使用jq
:
id='{"name":"john"}'
key=$(jq -r keys[] <<<"$id")
value=$(jq -r .[] <<<"$id")
-r
:このオプションを使用すると、フィルタ結果が文字列の場合は、引用符付きのJSON文字列形式ではなく標準出力に直接書き込まれます。
keys
: 組み込みファンクションキーは、オブジェクトが与えられるとそのキーを配列として返します。
使用json
:
id='{"name":"john"}'
key=$(json -ak <<<"$id")
value=$(json -a "$key" <<<"$id")
-a
入力を配列として扱う
-k
キー値を返す
答え3
あるいは、歩行経路ベースのUNIXユーティリティを使用することもできます。 jtc
:
id='{"name":"john"}'
bash $ key=$(jtc -w'[0]<>k' <<<"$id")
bash $ echo $key
"name"
bash $ value=$(jtc -w'[0]' <<<"$id")
bash $ echo $value
"john"
bash $
jtc
PS>公開:私はJSON操作用の-shell cliツールを作成した人です。