キーワードを使用した文字列の解析

キーワードを使用した文字列の解析

gps location日付、時刻、位置情報を返すbashコマンドを使用しています。

[john@hostname :~/develp] $ gps location
Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}

硬度をファイルに書きたいのですが、そこに到達する前に文字列を正しく解析する必要があります。

[john@hostname :~/develp] $ variable=`gps location | awk '/"longitude":/ {print $9}'`
[john@hostname :~/develp] $ echo $variable
"133.453",
[john@hostname :~/develp] $

現在、awk硬度を検索するのではなく、文字列全体を取得して9番目の文字列を見つけます。理想的には、正規表現/キーワードアプローチを使用して硬度を見つけ、次の文字列を探したいと思います。試してみてgrep | cutみましたsed。運が悪い。私ができることはawk

答え1

これを削除すると、Location:JSONが残ります。

$ echo '{"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    jq .longitude
"133.453"

キーワードをあらかじめ印刷しないオプションがある場合は、マニュアルページをご覧ください。gpsキーワードを削除しないと簡単です。例:Location:

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    cut -d':' -f2- | jq .longitude
"133.453"

または:

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    sed 's/Location://' | jq .longitude
"133.453"

答え2

残念ながら、私はコメントする評判が十分ではありませんが、Ed Mortonの回答を拡張するには、次のようにそのjqオプション-rを使用して呼び出すと、出力が文字列のとき(あなたのように)自動的に引用符が削除されます。

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | cut -d':' -f2- | jq -r .longitude
133.453

答え3

この機能を使用せずに試したい場合jq(例:利用できない場合)そしてあなたの例が示すように、出力は常に1行で、次のsed方法も機能します。

sed -r 's/.*"longitude": "([^"]+)".*/\1/'

これは

  • 二重引用符で囲まれた文字列を探します("([^"]+)"例:開始の後に"「最後まで」以外の"文字列が含まれています)。ここで囲まれた内容は、文字列の直後に"「キャプチャグループ」として定義されます。( ... )"longitude":
  • 行全体をキャプチャグループの内容()で置き換えます。\1あなたの場合、実際の硬度値です。

テスト:

~$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | sed -r 's/.*"longitude": "([^"]+)".*/\1/'
133.453

答え4

jqをインストールできない場合は、ループを使用して純粋なbashからインストールできます。

i=1
words=$(gps location)
word=$(echo $words | cut -d',' -f$i)
while ( [ -n "$word" ] )
  do
  echo $word | grep longitude | cut -d' ' -f2
  (( i+=1 ))
  word=$(echo $words | cut -d',' -f$i)
done

関連情報