2015-07-10 163 views
2

我试图从torrent文件中提取torrent名称。 没有深入了解Torrent文件的结构,我注意到我只需要匹配两个字符串之间的所有字符的最后出现位置,在我的情况下,它们是: * 12:piece lengthi正则表达式匹配两个字符串之间所有字符的最后一次出现

这里是Arch Linux的ISO torrent文件的开头:

d8:announce42:http://tracker.archlinux.org:6969/announce7:comment41:Arch Linux 2015.07.01 (www.archlinux.org)10:created by13:mktorrent 1.013:creation datei1435770645e4:infod6:lengthi677380096e4:name29:archlinux-2015.07.01-dual.iso12:piece lengthi 

我需要提取archlinux-2015.07.01-dual.iso女巫是:12:piece lengthi之间。我检查了这种模式与其他洪流文件在我的情况下,它会工作!我不知道如何结合正则表达式(?<=:)(.*)(?=12:piece lengthi):(?:.(?!:))+$,如果它们甚至是正确的。

我试图做一个bash脚本grepawksed或什么可以用一个Linux命令。

最终完美工作解决方案(经过全面测试): 这适用于所有类型的非标准字符,例如西里尔文

torrent_title=$(tr -d "\n" < "$filename" | iconv -f utf-8 -t utf-8 -c | sed 's/.*:\(.*\)12:piece lengthi.*/\1/') 

更新:所有建议的工作,但torrent文件是例如我试图 grep --textstrings file |管道传递到grep或sed的,但是从二进制文件随机字符串被搞乱了输出二进制文件。

Update 2和解决它:所以最后的命令是这样的

head -1 file.torrent| strings | tr -d "\n\r" | iconv -f utf-8 -t utf-8 -c| sed 's/.*:\(.*\)12:piece lengthi.*/\1/

我盘算了一下,信息只在文件的第一行。 在我原来的例子后我忘了在结束时复制一对夫妇更字符串

d8:announce42:http://tracker.archlinux.org:6969/announce7:comment41:Arch Linux 2015.07.01 (www.archlinux.org)10:created by13:mktorrent 1.013:creation datei1435770645e4:infod6:lengthi677380096e4:name29:archlinux-2015.07.01-dual.iso12:piece lengthi524288e6:pieces25840: 

女巫是第一线的一部分,所以,我需要稍微改变hek2mgl sed的 答案。

更新3做到这一点的正确方法是使用解析器,我很难学会它。

+0

必须有工具让你检查一个可以更正确使用的种子文件吗?这就是说,这似乎是一组“长度:值”对,所以你可能会做得更好,实际上只是解析它。 (虽然你粗暴的分裂也会奏效。) –

回答

2

我会用sed的是,像这样的:

sed 's/.*:\(.*\)12:piece lengthi/\1/' input.torrent 
+0

谢谢。该命令帮助我完成了我的目标! –

2

试试这个与GNU的grep:

grep -oP ':\K[^:]*(?=12:piece lengthi$)' file 

输出:

 
archlinux-2015.07.01-dual.iso 
2

试试这个:

sed -e 's/12:piece lengthi//' -e 's/.*://' 
相关问题