2015-07-10 164 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/.*://' 
相關問題