正则表达式匹配两个字符串之间所有字符的最后一次出现

时间:2015-07-10 18:25:10

标签: regex linux bash awk sed

我试图从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。我用其他torrent文件检查了这个模式,在我的情况下它会起作用!如果它们甚至是正确的,我无法弄清楚如何将正则表达式(?<=:)(.*)(?=12:piece lengthi):(?:.(?!:))+$结合起来。

我尝试使用grep OR awksed或使用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 --textstrings 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正确的方法是使用解析器,我学的很难。

3 个答案:

答案 0 :(得分:2)

我会使用resources :categories do resources :posts, only: [ :index ] end ,就像这样:

sed

答案 1 :(得分:2)

尝试使用GNU grep:

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

输出:

archlinux-2015.07.01-dual.iso

答案 2 :(得分:2)

试试这个:

 sed -e 's/12:piece lengthi//' -e 's/.*://'