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파일 이름을 두 번째, 세 번째 등의 인수로 예상합니다. 파일 이름이 없으면 표준 입력에서 읽습니다. 따라서 처리하려는 텍스트가 파일에 없으면 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

관련 정보