sed로 bash 변수 처리


16

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


1
파이썬, 루비, 심지어 PERL과 같은 스크립팅 언어를 배우면 쉘이 모든 것을 수행하도록 강요하지 않아도됩니다. UNIX 시스템에서 Javascript (Rhino)를 실행할 수 있으며 거의 ​​모든 사람이 Javascript를 알아야합니다.
마이클 딜런

이러한 가치는 어디에서 오는가? bash변수 에 배치하여 추가 단계를 추가하는 것보다 원래 소스에서 위도와 경도 값을 구문 분석하는 것이 더 효율적 입니다.
Kusalananda

답변:


18

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

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

첫 번째 예제는 POSIX 셸이 아닌 bash에서만 작동합니다.
gelraen

1
@gelraen 따라서#!/bin/bash
SiegeX

추가 확장 내용은 여기를 참조하십시오 : gnu.org/software/bash/manual/…
Ricardo Stuven

22

이 경우에는 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"

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

-1
LATLNG="(53.3096,-6.28396)"
set ${LATLNG//[(,)]/ }
LAT=$1
LON=$2

당신은 아마해야 할 set -- ...첫 번째 문자가 매우 가능성이 높습니다 -.
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.