키워드를 사용하여 문자열 구문 분석

키워드를 사용하여 문자열 구문 분석

gps location날짜, 시간 및 위치 정보를 반환하는 bash 명령을 사용하고 있습니다 .

[john@hostname :~/develp] $ gps location
Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}

경도를 파일에 쓰고 싶은데 거기에 도달하기 전에 문자열을 올바르게 구문 분석해야 합니다.

[john@hostname :~/develp] $ variable=`gps location | awk '/"longitude":/ {print $9}'`
[john@hostname :~/develp] $ echo $variable
"133.453",
[john@hostname :~/develp] $

현재는 awk경도를 검색하는 대신 전체 문자열을 가져와서 9번째 문자열을 찾습니다. 이상적으로는 정규식/키워드 접근 방식을 사용하고 경도를 찾은 다음 다음 문자열을 찾고 싶습니다. 사용해 보고 grep | cut시도해 보았습니다 sed. 운이 좋지 않습니다. 내가 할 수 있는 일은 awk.

답변1

이를 제거하면 Location:JSON이 남습니다.

$ echo '{"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    jq .longitude
"133.453"

키워드를 미리 인쇄하지 않는 옵션이 있으면 매뉴얼 페이지를 참조하세요. gps키워드를 제거하지 않으면 쉽습니다. 예:Location:

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    cut -d':' -f2- | jq .longitude
"133.453"

또는:

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    sed 's/Location://' | jq .longitude
"133.453"

답변2

불행히도 나는 논평할 평판이 충분하지 않지만 Ed Morton의 답변을 확장하려면 다음과 같이 jq해당 -r옵션을 사용하여 호출하면 출력이 문자열일 때(귀하의 경우와 같이) 자동으로 따옴표가 제거됩니다.

$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | cut -d':' -f2- | jq -r .longitude
133.453

답변3

이 기능을 사용하지 않고 시도 하고 싶다면 jq(예: 사용할 수 없는 경우)그리고귀하의 예에서 알 수 있듯이 출력은 항상 한 줄이며 다음 sed방법도 작동합니다.

sed -r 's/.*"longitude": "([^"]+)".*/\1/'

이것은 것이다

  • 큰따옴표로 묶인 문자열을 찾습니다( "([^"]+)"예: 시작 뒤에 ""끝까지 " 이외의 것 포함된 "문자열 이 옴). 여기서 묶인 내용은 문자열 바로 다음에 ""캡처 그룹"으로 정의됩니다.( ... )"longitude":
  • 전체 줄을 캡처 그룹의 내용( )으로 바꿉니다. \1귀하의 경우 실제 경도 값입니다.

시험:

~$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | sed -r 's/.*"longitude": "([^"]+)".*/\1/'
133.453

답변4

jq를 설치할 수 없다면 루프를 사용하여 순수 bash에서 설치할 수 있습니다.

i=1
words=$(gps location)
word=$(echo $words | cut -d',' -f$i)
while ( [ -n "$word" ] )
  do
  echo $word | grep longitude | cut -d' ' -f2
  (( i+=1 ))
  word=$(echo $words | cut -d',' -f$i)
done

관련 정보