【问题标题】:Regex match last occurrence of all characters between two strings正则表达式匹配两个字符串之间所有字符的最后一次出现
【发布时间】:2015-07-10 18:25:09
【问题描述】:

我正在尝试从 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):(?:.(?!:))+$ 组合起来,如果它们完全正确的话。

我正在尝试使用 grepawksed 或使用 linux 命令可以创建的 bash 脚本。

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

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:

witch 是第一行的一部分,因此我需要稍微更改 hek2mgl sed 回答。

更新 3 正确的方法是使用解析器,我学得很辛苦。

【问题讨论】:

  • 必须有工具可以让您检查可以更正确地用于此目的的 torrent 文件吗?话虽这么说,这似乎是一组 length:value 对,所以你可能会更好地实际解析它。 (尽管您的粗略拆分也可以。)

标签: regex linux bash awk sed


【解决方案1】:

我会为此使用sed,如下所示:

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

【讨论】:

    【解决方案2】:

    用 GNU grep 试试这个:

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

    输出:

    archlinux-2015.07.01-dual.iso

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 2012-11-17
        相关资源
        最近更新 更多