如何使用shell脚本获得管道命令的正则表达式匹配?



首先,我试图从一个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。可以重用的部分是12
  • 所以在if中,每个数字都被括号包围。
  • =~被处理时,BASH_REMATCH数组被定义为每个section。
  • "DEBUG"echo语句可以删除或注释掉。

如果有多个"Extent:…"在KML文件中,您可以循环每一行并一次处理每一行。

最新更新