sedを使用したbash変数の処理


16

bash変数LATLNGには、そのような括弧内に緯度と経度の値が含まれています

(53.3096,-6.28396)

私はこれらをLATとLONと呼ばれる変数に解析したいので、sedを介してそうしようとしています

LAT=$(sed "s/(\(.*\),\(.*\))/\1/g" "$LATLNG")
LON=$(sed "s/(\(.*\),\(.*\))/\2/g" "$LATLNG")

ただし、次のエラーが表示されます。

sed: can't read (53.3096,-6.28396): No such file or directory


1
Python、Ruby、場合によってはPERLのようなスクリプト言語を学んでください。そうすれば、シェルにすべてを強制する必要がなくなります。Javascript(Rhino)をUNIXシステムで実行することもできます。ほとんどの人はJavascriptを知っている必要があります。
マイケルディロン

これらの価値はどこから来るのでしょうか?元のソースから緯度と経度の値を解析する方が、bash変数に値を入れて追加のステップを追加するよりも効率的です。
クサラナナンダ

回答:


18

これは、純粋なシェル構文を使用して解決できます。ただし、かっこ(かっこ)があるため、一時変数が必要です。

#!/bin/bash

LATLNG="(53.3096,-6.28396)"

tmp=${LATLNG//[()]/}
LAT=${tmp%,*}
LNG=${tmp#*,}

代わりに、ビルトインで遊んでIFS使用することにより、一度にそれを行うことができますread

#!/bin/bash

LATLNG="(53.3096,-6.28396)"

IFS='( ,)' read _ LAT LNG _ <<<"$LATLNG"

最初の例はbashでのみ機能し、POSIXシェルでは機能しません。
ゲラーレン

1
@gelraenしたがって#!/bin/bash
SiegeX

ここで他の拡張を参照してください:gnu.org/software/bash/manual/…–
リカルド

22

SiegeXの答えは、この特定のケースには適していますが、任意のテキストをに渡す方法も知っておく必要がありますsed

sed2番目、3番目などのパラメータとしてファイル名が必要です。ファイル名が見つからない場合は、標準入力から読み取ります。したがって、ファイルにないテキストを処理したい場合は、それをにパイプする必要がありますsed。最も簡単な方法は次のとおりです。

echo "blah blah" | sed 's/blah/blam/g'

したがって、例は次のようになります。

LAT=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\1/g')
LON=$(echo "$LATLNG" | sed 's/(\(.*\),\(.*\))/\2/g')

代替(より良いがより不明瞭な)メソッド

$LATLNGダッシュで始まる可能性があると思う場合、またはあなたがbe慢になりたい場合は、printf代わりに使用する必要がありますecho

printf '%s' "$LATLNG" | sed 's/foo/bar/g'

または「ヒアドキュメント」ですが、使用している構成体では少し厄介な場合があります。

LAT=$(sed 's/foo/bar/g' <<END
$LATLNG
END
)

または、bash移植性を心配していないのに使用している場合は、「here文字列」を使用できます。

sed 's/foo/bar/g' <<< "$LATLNG"

3

POSIXシェルで機能するソリューションを次に示します。

parse_coordinates () {
  IFS='(), '  # Use these characters as word separators
  set -f      # Disable globbing
  set $1      # Split $1 into separate words
  set +f      # Restore shell state
  unset IFS
  LAT=$2      # $1 is the empty word before the open parenthesis
  LON=$3
}
parse_coordinates "$LATLNG"

使用されている特定の構文を解析する、同様に移植可能な別のソリューションがあります。

LAT=${LATLNG%\)}    # strip final parenthesis
LAT=${LAT#\(}       # strip initial parenthesis
LON=${LAT##*[, ]}   # set LON to everything after the last comma or space
LAT=${LAT%%[, ]*}   # set LAT to everything before the first comma or space

-1
LATLNG="(53.3096,-6.28396)"
set ${LATLNG//[(,)]/ }
LAT=$1
LON=$2

おそらく、やるべきset -- ...最初の文字が非常に良いチャンスがあります-
mikeserv 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.