我試圖從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腳本grep
或awk
或sed
或什麼可以用一個Linux命令。
最終完美工作解決方案(經過全面測試): 這適用於所有類型的非標準字符,例如西里爾文。
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的,但是從二進制文件隨機字符串被搞亂了輸出二進制文件。
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做到這一點的正確方法是使用解析器,我很難學會它。
必須有工具讓你檢查一個可以更正確使用的種子文件嗎?這就是說,這似乎是一組「長度:值」對,所以你可能會做得更好,實際上只是解析它。 (雖然你粗暴的分裂也會奏效。) –