如何合并两个SED正则命令?批量提取HTML中地址与GPS坐标
解决SED合并匹配地址与GPS信息的问题
我来帮你搞定这个SED合并的难题!你遇到的核心问题是正则贪婪匹配在搞鬼——默认情况下SED的.*会尽可能匹配最多的字符,导致电话号码之后到GPS部分的所有冗余HTML都被吞进了匹配结果里。下面给你两种可行的解决方案:
方案一:精准定位GPS的匹配位置
直接修改正则,跳过中间冗余内容,直接定位到GPS所在的src属性部分,避免贪婪匹配的干扰:
sed -n -e 's/^.*address23ca storeh2..\(.*\) Address<\/h2.*optmob..\(.*\)<br>\(.*\)<br>\(.*\)<br>\(.*\)<\/p><p class="addressbox23.*Telephone: \(.-...-...-....\).*src="https:\/\/www.google.com\/maps\/embed\/v1\/place?q=\(.*\)&key.*$/\1,\2,\3,\4,\5,\6,\7/p' afile.html
用你提供的精简HTML测试,这个命令会输出:
142 Wayne Street,Abbey,Saskatchewan,S0N 0A0,1-866-607-6301,50.736301,-108.757103
方案二:分步骤匹配后合并结果
如果超长正则看着头疼,可以用SED的多命令处理,把地址/电话和GPS的提取分开,再合并结果:
sed -n -e '/address23ca storeh2/{s/^.*address23ca storeh2..\(.*\) Address<\/h2.*optmob..\(.*\)<br>\(.*\)<br>\(.*\)<br>\(.*\)<\/p><p class="addressbox23.*Telephone: \(.-...-...-....\).*$/\1,\2,\3,\4,\5,\6/;h}' -e '/v1\/place/{s/^.*v1\/place?q=\(.*\)&key.*$/\1/;G;s/\n/,/;p}' afile.html
这个命令的逻辑是:
- 第一步:匹配到包含地址的行,提取地址和电话,把结果暂存到SED的hold空间(
h命令) - 第二步:匹配到包含GPS的行,提取GPS坐标,然后把hold空间里的地址/电话取出来(
G命令),把换行符替换成逗号,最后输出合并后的结果
为什么你的原命令会失败?
SED的正则是贪婪匹配模式,你原命令里的\(.*\).^*v1\/place?中的.*会从电话号码后面开始,一直匹配到v1/place?之前的最后一个字符,中间所有的HTML内容(比如<div>、<iframe>标签等)都被包含进了匹配组,所以输出会带冗余内容。通过精准定位GPS的位置,或者分步骤处理,就能避开这个问题。
内容的提问来源于stack exchange,提问作者chris loughnane
相关产品推荐
相关产品推荐

