标题: [文本处理] 批处理BAT如何在一堆URL中提取其每行的一级域名? [打印本页]
作者: 封印 时间: 2014-2-17 17:36 标题: 批处理BAT如何在一堆URL中提取其每行的一级域名?
一个文本中,有如以下等URL地址。需要把URL地址的一级域名给提取出来(注意,有些是两个URL地址在一行上,如最后一条情况)多谢高手啊。
http://volcano-box.com
http://vosonghaokiet.com
http://vosshare.com
http://vplay.in.th/
http://vpn.buu.ac.th/
http://vpn.nkh.go.th/
http://vpngate.jp
http://vpnium.com
http://vpntool.com
http://vprdownload.com
http://vps.highrez.co.uk/
http://vps.ichetservices.com
http://vs1.learnbalance.com
http://vs2.learnbalance.com
ttp://visitdelphi.gr/java/tmp/system/NOTA-FISCAL-09.rar6
http://visitdelphi.gr/java/tmp/system/NOTA-FISCAL-10.rar
http://vera.bl.ee/video/tugas_tik.rar
http://nte.ufsm.br/http://ntrack.com
作者: xxpinqz 时间: 2014-2-17 19:38
倒数4行少个H?- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"
- set "str=!str:*:=!"
- set "str=!str::= !"
- for %%i in (!str!) do (
- for /f "delims=/" %%a in ("%%i") do echo,%%a
- )
- ))>b.txt
复制代码
作者: 封印 时间: 2014-2-17 19:50
回复 2# xxpinqz
谢谢你啦, 我试试。
少个H不影响吧。域名不包含HTTP
作者: 封印 时间: 2014-2-17 19:54
本帖最后由 封印 于 2014-2-17 20:09 编辑
回复 2# xxpinqz
试了一下,二级域名和三级域名都留了一下。还要把二级和三级域名,提取到顶级域名。
比如:
files.files02.arabsh.co.jp
files.files03.arabsh.com
等,这个类型。
提取到arabsh.com和arabsh.co.jp
作者: bluewing009 时间: 2014-2-17 21:01
回复 1# 封印
能不能按照你给的例子 把正确的结果写出来
我对理解你的题意有些偏差
作者: 封印 时间: 2014-2-17 21:38
本帖最后由 封印 于 2014-2-17 21:43 编辑
回复 5# bluewing009
一个文本里(a.TXT),里面有很多URL。把里面的URL中顶级域名提出来。
比如fifa3.dn.nexoncdn.co.kr,就提取nexoncdn.co.kr。
比如fichiers.touslesdrivers.com,就提取touslesdrivers.com
比如http://visitdelphi.gr/java/tmp/system/NOTA-FISCAL-10.rar,就提取visitdelphi.gr
只要顶级域名。
作者: 封印 时间: 2014-2-18 10:13
顶上去先,让高手看到。
作者: DAIC 时间: 2014-2-18 13:09
files.files02.a.b.c
你说我这个域名的顶级域名是 a.b.c 呢?还是 b.c 呢?
作者: 封印 时间: 2014-2-18 15:02
回复 8# DAIC
这就是需要判断了啊,人工当然可以判断。一般来说是b.c
也有可能是a.b.c
作者: DAIC 时间: 2014-2-18 15:11
回复 9# 封印
你需要说清楚如何做人工判断
有规律、有方法,最后转换成代码就行了。
作者: apang 时间: 2014-2-18 16:05
- Set fso = CreateObject("Scripting.FileSystemObject")
- txt = fso.OpenTextFile("a.txt",1).ReadAll
- Set re = New RegExp
- pattern = "com|net|org|gov|edu|mil|biz|name|info|mobi|pro|"
- pattern = pattern & "travel|museum|int|aero|post|rec|asia"
- re.Pattern = "[\w\-]+\.([a-z]{2}|" & pattern & ")(\.[a-z]{2})?(?:\b|/)"
- re.IgnoreCase = True
- re.Global = True
- For Each a in re.Execute(txt)
- str = str & a & vbCrLf
- Next
- WScript.Echo str
复制代码
作者: 封印 时间: 2014-2-18 16:33
回复 11# apang
这个VBS没有运行起来。运行完之后是这样子:
作者: 封印 时间: 2014-2-18 16:44
回复 10# DAIC
好吧,从后往前,开始,可以按结尾的字符个数判断。结尾后六个字符(包含“.”),如co.jp,.com,com.cn。者截取,前一个点为止。
比如。ABC.DEF.CO.JP。截取到DEF.CO.JP。
ABC.DEF.COM.CN,则截取到DEF.COM.CN
也可以把所有域名后缀列个表。然后包含域名中的后缀则截取域名后缀之前的字符串,直到遇到有"."为止。
比如ABC.DEF.COM
后缀列表中有com就可以取DEF.COM
当然,也可以有更好的方法。
作者: xxpinqz 时间: 2014-2-18 19:11
自己都没理顺思路,叫人如何写。这样试试,后面是两字符的取3组,余者取两- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in (a.txt) do (
- set "str=%%b"
- set "str=!str::= !"
- for %%i in (!str!) do (
- for /f "delims=/" %%a in ("%%i") do (
- set "str=%%a"
- set "str=!str:.= !"
- set m=0
- for %%a in (!str!) do (
- set/a m+=1
- set "#!m!=%%a."
- set "tmp=%%a"
- )
- if "!tmp:~2!"=="" (set/a n=m-2) else set/a n=m-1
- set "e="
- for /l %%a in (!n!,1,!m!) do set "e=!e!!#%%a!"
- echo,!e:~,-1!
- )
- )
- ))>b.txt
复制代码
作者: 封印 时间: 2014-2-18 20:28
回复 14# xxpinqz
嗯,这段已经,已经很牛B了。。虽然还有少部分URL没截取成功。但已经无限接近完美了。值得学习。
作者: terse 时间: 2014-2-19 00:50
判断结尾后六个字符的长度- @echo off
- for /f "delims=" %%i in (a.txt) do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- set str=!str:http://= !
- for %%a in (!str!) do (
- for /f "delims=/" %%b in ("%%a") do set str=%%b
- for /f %%b in ("!str!") do (
- for /f %%c in ("!str:.=\!\..") do set s=%%~nc%%~xb&set "str=%%~nb"
- if "!s:~6!" == "" for /f %%d in ("!str:.=\!\..") do (
- if "%%~nd" neq "" set s=%%~nd.!s!
- )
- echo !s!
- )
- )
- endlocal
- )
- pause
复制代码
作者: DAIC 时间: 2014-2-19 07:48
回复 15# 封印
你把没有成功提取的贴出来,也许可以变成绝对完美。
作者: 封印 时间: 2014-2-19 14:24
回复 14# xxpinqz
朋友,还能再改一下吗?
后面两字符的,取三组的话。那像ABC.DEF.CN这类型取出来就是二级域名了。
分两种情况,比如一种是ABC.DEF.GH.IJ这类型,后缀是GH.IJ
一种是ABC.DEF.IJ这类型后缀是IJ
按照特征来看的话,后缀圆点左右各两字符的取三组。后缀圆点右边两字符的,取两组就可以了。
看看怎么样?
作者: 封印 时间: 2014-2-19 15:03
回复 16# terse
运行完后,没有生成整理后的文本啊。
作者: DAIC 时间: 2014-2-19 15:11
回复 19# 封印
你自己加个重定向就行了啊
作者: 封印 时间: 2014-2-19 16:00
回复 20# DAIC
嗯,加好了,效果更完美了。
只是这代码FOR这么多层,对我来说好难理清啊。要是能注释一下,就更好了 。
向你学习
作者: terse 时间: 2014-2-19 16:53
回复 19# 封印
将第二行至第十七行括起来 然后重定向到B.TXT复制代码
作者: xxpinqz 时间: 2014-2-20 12:38
回复 18# 封印
如此:- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in (a.txt) do (
- set "str=%%b"
- set "str=!str::= !"
- for %%i in (!str!) do (
- for /f "delims=/" %%a in ("%%i") do (
- set "str=%%a"
- set "str=!str:.= !"
- set m=0
- set "tmp="
- for %%a in (!str!) do (
- set/a m+=1
- set ".=!tmp!"
- set "#!m!=%%a."
- set "tmp=%%a"
- )
- if "!.:~2!"=="" (set/a n=m-2) else set/a n=m-1
- set "e="
- for /l %%a in (!n!,1,!m!) do set "e=!e!!#%%a!"
- echo,!e:~,-1!
- )
- )
- ))>b.txt
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |