我正在尝试从种子文件中提取种子名称。
在没有深入研究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)
和:(?:.(?!:))+$
,即使它们是完全正确的。我正在尝试使用
grep
或awk
或sed
或使用Linux命令可以制作的bash脚本。最终完美的解决方案(经过全面测试):
这适用于所有类型的非标准字符,例如Cyrillic 。
torrent_title=$(tr -d "\n" < "$filename" | iconv -f utf-8 -t utf-8 -c | sed 's/.*:\(.*\)12:piece lengthi.*/\1/')
更新:所有建议工作都可行,但Torrent文件是二进制文件,例如,我尝试将
grep --text
和strings file |
管道传输到grep或sed,但是二进制文件中的随机字符串使输出困惑。更新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做到这一点的正确方法是使用解析器,这是我很难学的。
最佳答案
我会为此使用sed
:
sed 's/.*:\(.*\)12:piece lengthi/\1/' input.torrent
关于regex - 正则表达式匹配两个字符串之间所有字符的最后一次出现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31347769/