如何使用Shell脚本获取管道命令输出的正则匹配结果
脚本闪退原因
你写的脚本混用了两种完全不兼容的语法:
- 首行
#!/bin/bash是Linux/macOS/WSL/Git Bash等类Unix环境的Shell声明 for /f、%%a是Windows原生批处理(.bat/.cmd)的专属语法,二者同时使用会直接报错退出。
如果是Windows环境下直接双击运行的脚本,直接使用Windows批处理语法即可,不需要加#!/bin/bash头,脚本末尾加pause可以避免运行完直接闪退。
坐标提取实现方案
不需要依赖findstr做正则截取,直接通过字符串分割即可拿到四个坐标,两种常用环境的实现如下:
方案1:Windows原生批处理实现
无需安装额外工具,直接用系统自带功能即可完成:
@echo off setlocal enabledelayedexpansion :: 提取Extent行并分割坐标 for /f "tokens=2,3,5,6 delims=(),- " %%a in ('ogrinfo C:/test.kml -so -al ^| findstr "Extent"') do ( :: 按要求格式拼接,对应minLon,maxLon,minLat,maxLat set res=%%a,%%c,%%b,%%d :: 输出到控制台 echo !res! :: 写入output文件 echo !res!>output :: 存入独立变量供后续使用 set minLon=%%a set maxLon=%%c set minLat=%%b set maxLat=%%d ) :: 测试打印变量 echo min经度: %minLon% echo max经度: %maxLon% echo min纬度: %minLat% echo max纬度: %maxLat% pause
方案2:Bash环境(Git Bash/WSL/类Unix环境)实现
如果使用的是类Unix Shell环境,用awk分割字符串即可快速提取:
#!/bin/bash # 提取Extent行 extent_line=$(ogrinfo C:/test.kml -so -al | grep "Extent") # 拆分获取四个坐标值 minLon=$(echo $extent_line | awk -F'[(), -]' '{print $3}') minLat=$(echo $extent_line | awk -F'[(), -]' '{print $5}') maxLon=$(echo $extent_line | awk -F'[(), -]' '{print $9}') maxLat=$(echo $extent_line | awk -F'[(), -]' '{print $11}') # 拼接为要求的格式 res="${minLon},${maxLon},${minLat},${maxLat}" echo $res echo $res > output # 打印变量验证 echo "min经度: $minLon" echo "max经度: $maxLon" echo "min纬度: $minLat" echo "max纬度: $maxLat"
内容的提问来源于stack exchange,提问作者steepcurve
相关产品推荐
相关产品推荐

