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
SiegeXの答えは、この特別なケースに適していますが、任意のテキストをsed
。
sed
ファイル名を2番目、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
表現したい場合は、printf
代わりに次のものを使用する必要がありますecho
。
printf '%s' "$LATLNG" | sed 's/foo/bar/g'
または、「ここで文書化」しますが、使用している構造によっては少しぎこちないことがあります。
LAT=$(sed 's/foo/bar/g' <<END
$LATLNG
END
)
bash
あるいは、移植性を気にせずに使用する場合は、「ここで文字列」を使用できます。
sed 's/foo/bar/g' <<< "$LATLNG"
答え2
これは純粋なシェル構文で解決できます。ただし、括弧(角括弧)のために一時変数が必要です。
#!/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"
答え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
答え4
LATLNG="(53.3096,-6.28396)"
set ${LATLNG//[(,)]/ }
LAT=$1
LON=$2