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