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
답변
LATLNG="(53.3096,-6.28396)"
set ${LATLNG//[(,)]/ }
LAT=$1
LON=$2