首先,我试图从一个KML文件获得一个特定的属性。现在,我尝试了
ogrinfo C:/test.kml -so -al | findstr "Extent"
被推荐给我并输出
Extent: (-100.054053, 33.702234) - (-94.647180, 37.125712)
我将以
的形式要求它-100.054053,-94.647180,33.702234,37.125712
,我认为使用regex。
我试了下面的命令看看它输出了什么:
ogrinfo C:/test.kml -so -al | findstr "Extent" | findstr /r /c:"-*[0-9]*.[0-9]*"
但这仍然输出
Extent: (-100.054053, 33.702234) - (-94.647180, 37.125712)
我在某个地方读到Windows的FINDSTR
只输出它匹配的行,而不是正则表达式匹配自己。有别的方法吗?
如果我得到的工作,我会保存在不同的变量在shell脚本的某种方式的匹配。我不是shell脚本专家,但我一直在寻找周围,并正在考虑做这样的事情
#!/bin/bash
for /f "tokens=*" %%a in ('ogrinfo C:/test.kml -so -al ^| findstr "Extent" ^| findstr /r /c:"-*[0-9]*.[0-9]*"') do (
echo %%a
#do something
)
done >output
但是运行这个命令会导致shell立即消失,甚至看不到错误。
假设
-
你有一个原始数据的kml文件。
-
您可以提取以"Extent: "开头的单行要获取所需的值
-
单行=>在KML文件
中只有一行是这种格式。 -
该行格式为:
Extent: (NUMBER1, NUMBER2) - (NUMBER3, NUMBER4)
-
号码可以包含以下字符:
0 1 2 3 4 5 6 7 8 9 . -
-
你想要的输出是:
NUMBER1,NUMBER3,NUMBER2,NUMBER4
仅使用Linux工具,您可以这样做:
#!/bin/bash
#
datafile="data.kml"
# Ensure the data file exists
if [[ ! -f "$datafile" ]]
then
echo "ERROR: the data file does not exist."
exit 1
fi
# Extract the "Extent:" line
dataline=$(grep "Extent: " "$datafile")
# Make sure the line is of a valid format, and assign the number variables
if [[ $dataline =~ "Extent: ("([0-9.-]+)", "([0-9.-]+)") - ("([0-9.-]+)", "([0-9.-]+)")" ]] && number1="${BASH_REMATCH[1]}" && number2="${BASH_REMATCH[2]}" && number3="${BASH_REMATCH[3]}" && number4="${BASH_REMATCH[4]}"
then
echo "-----DEBUG-----"
echo "line==$dataline"
echo "1==$number1"
echo "2==$number2"
echo "3==$number3"
echo "4==$number4"
echo "-- END DEBUG --"
echo ""
echo "$number1,$number3,$number2,$number4"
else
echo "ERROR: there is no "Extent: " line in the data file ($datafile)"
fi
细节:
- 一切都在
if
行完成。 =~
将左侧的图案与右侧的图案匹配。- 在正则表达式中,您可以定义想要与
( )
重用的部分。 - Ex:
abcd(1)efgh(2)ijkl
。可以重用的部分是1
和2
。 - 所以在
if
中,每个数字都被括号包围。 - 当
=~
被处理时,BASH_REMATCH
数组被定义为每个section。 - "DEBUG"
echo
语句可以删除或注释掉。
如果有多个"Extent:…"在KML文件中,您可以循环每一行并一次处理每一行。