태그 보관물: shell

shell

sed로 bash 변수 처리 변수 LATLNG에는 위도 및

bash 변수 LATLNG에는 위도 및 경도 값이 괄호 안에 들어 있습니다.

(53.3096,-6.28396)

나는 이것을 sed를 통해하려고하는 LAT와 LON이라는 변수로 파싱하고 싶다.

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



답변

이것은 순수 쉘 구문을 통해 해결할 수 있습니다. 괄호 (괄호) 때문에 임시 변수가 필요합니다.

#!/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"

답변

이 경우에는 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대시로 시작할 수 있는 기회가 있다고 생각 하거나 pedantic하고 싶다면 다음 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"

답변

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