Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 使用shell从标记中提取多个属性_Html_Regex_Extract_Xpath_Bash - Fatal编程技术网

Html 使用shell从标记中提取多个属性

Html 使用shell从标记中提取多个属性,html,regex,extract,xpath,bash,Html,Regex,Extract,Xpath,Bash,我试图从以下格式的文件中提取两个属性“lat”和“lon”: <trkpt lat="38.8577288" lon="-9.0997973"/> <trkpt lat="38.8576367" lon="-9.1000557"/> <trkpt lat="38.8575259" lon="-9.1006374"/> ... (是的,lat/lon对故意倒置) 我对regex了解不多,但在网络上环顾四周,这就是我所能做到的: grep 'lat="[^"]*

我试图从以下格式的文件中提取两个属性“lat”和“lon”:

<trkpt lat="38.8577288" lon="-9.0997973"/>
<trkpt lat="38.8576367" lon="-9.1000557"/>
<trkpt lat="38.8575259" lon="-9.1006374"/>
...
(是的,lat/lon对故意倒置)

我对regex了解不多,但在网络上环顾四周,这就是我所能做到的:

grep 'lat="[^"]*"' doc.txt | grep -no 'lat="[^"]*"'

output:
1:lat="38.8577288"
2:lat="38.8576367"
3:lat="38.8575259"
我不知道该怎么做。。。
提前感谢您的帮助

假设格式保持此顺序,只需一次

Find:                           Replace:
.+lat="(.+?)".*lon="(.+?)".+    $2,$1

捕获组确保按顺序查找lat和lon,然后获取引号中的内容。它确保包含行的其余部分,因此替换将丢弃它。

尝试使用类似Python的方法:

python -c 'import re; open("dest", "w").write("\n".join([lat + "," + lon for lat, lon in re.findall("""<trkpt lat="([-0-9\.]+)" lon="([-0-9\.]+)"/>""", open("source").read())]))'
使用&(不应该使用正则表达式解析HTML或XML!)

如果您还没有
xmllint
,请安装
libxml2

for i in {1..3}; do
    lat=$(xmllint --html --xpath "string(//trkpt[$i]/@lat)" file.xml)
    lon=$(xmllint --html --xpath "string(//trkpt[$i]/@lon)" file.xml)
    echo "$lon,$lat"
done < file.xml 2>/dev/null
{1..3}中i的
;做
lat=$(xmllint--html--xpath“string(//trkpt[$i]/@lat)”file.xml)
lon=$(xmllint--html--xpath“string(//trkpt[$i]/@lon)”file.xml)
echo“$lon$lat”
完成/dev/null
(如果您的XML是完全有效的XML,请删除
--html



请参见

似乎您在两个命令中都得到了
lat
,您根本没有要求
lon
?这个解决方案对我来说非常有效。感谢大家的帮助。不要使用正则表达式解析XML@Matthiasurelichs OP的文档可能是也可能不是XML。显示的部分似乎与XML兼容,但文档的其余部分可能与XML兼容,也可能与XML不兼容。例如,Apache配置文件中有一些元素,如果单独显示的话,这些元素看起来就是XML,但是XML解析器不能对整个文档起作用,因为它的其余部分与XML.Owch完全不同。你也不应该假设那里正好有三个点。
#! /usr/bin/env python

# use the regex module
import re

# read in the file
in_file = open('source').read()

# Find matches using regex
matches = re.findall('<trkpt lat="([-0-9\.]+)" lon="([-0-9\.]+)"/>', in_file)

# make new file lines by combining lat and lon from matches
out_lines = [lat + ',' + lon for lat, lon in matches]

# convert array of strings to single string
out_lines = '\n'.join(out_lines)

# output to new file
open('dest', 'w').write(out_lines)
for i in {1..3}; do
    lat=$(xmllint --html --xpath "string(//trkpt[$i]/@lat)" file.xml)
    lon=$(xmllint --html --xpath "string(//trkpt[$i]/@lon)" file.xml)
    echo "$lon,$lat"
done < file.xml 2>/dev/null