在一个小的bash脚本中,我只是尝试修剪GPS输入数据,以便我在单独的变量中具有经度和纬度值:
echo $geo_data
GPS_latitude=$( echo $geo_data | awk -F"+|-" '{print substr($0,index($0,$2-1),1) $2}' )
GPS_longitude=$( echo $geo_data | awk -F"+|-" '{print substr($0,index($0,$3-1),1) $3}' )
echo $GPS_latitude
echo $GPS_longitude
但是我得到的东西似乎混淆了每个组件前面的 +/- 符号:
-04.7367+055.5230
-04.7367
-055.5230
我以为 index((-参数可以完全避免这种情况,但显然我做错了什么。知道如何解决这个问题吗?
使用 bash 和正则表达式:
geo_data="-04.7367+055.5230"
[[ "$geo_data" =~ ^([+-][0-9.]+)([+-][0-9.]+)$ ]]
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"
输出:
-04.7367 +055.5230
您需要从index
而不是字段值的输出中减去1
$ echo '-04.7367+055.5230' | awk -F"+|-" '{print substr($0,index($0,$2)-1,1) $2}'
-04.7367
$ echo '-04.7367+055.5230' | awk -F"+|-" '{print substr($0,index($0,$3)-1,1) $3}'
+055.5230
您还可以使用 bash 参数扩展
$ s='-04.7367+055.5230'
$ a="${s%+*}"
$ b="${s#${s%+*}}"
$ echo "$a"
-04.7367
$ echo "$b"
+055.5230
$ # or, use the value of variable 'a'
$ c="${s#$a}"
$ echo "$c"
+055.5230
您可以使用sed
来提取这些值:
geo_data='-04.7367+055.5230'
GPS_latitude=$(sed 's/(.*)[-+].*/1/' <<< "$geo_data")
GPS_longitude=$(sed 's/.*([-+].*)/1/' <<< "$geo_data")
echo "GPS Latitude: ${GPS_latitude} and GPS longitude: ${GPS_longitude}"
# => GPS Latitude: -04.7367 and GPS longitude: +055.5230
观看在线演示
纬度模式是(.*)[-+].*
,它将+
或-
的所有字符捕获到第 1 组中,然后匹配其余字符。匹配项将替换为组 1 内容,因此您可以在最后一个+
或-
之前获得所有内容。
POSIX BRE 正则表达式详细信息
(
- 捕获组 #1 的开始(1
从替换模式引用此值(.*
- 任意 0 个或多个字符
)
- 捕获组结束[-+]
- 与-
或+
匹配的括号表达式.*
- - 任意 0 个或多个字符。
GPS_longitude
模式是相同的,但捕获最后一个-
或+
之后的所有内容,包括加号或连字符。
grep
解决方案:
$ geo_data=-04.7367+055.5230
$ echo $geo_data
-04.7367+055.5230
$ GPS_latitude=$(grep -o '^[+-][^+-]*' <<< $geo_data)
$ GPS_longitude=$(grep -o '[+-][^+-]*$' <<< $geo_data)
$ echo "GPS Latitude: $GPS_latitude; GPS Longitude: $GPS_longitude"
GPS Latitude: -04.7367; GPS Longitude: +055.5230