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

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

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

関連情報