2010-06-15 106 views
0

我有一個電影列表的輸入文件匹配的文件(請注意,可能有一些重複的條目):使用正則表達式

American_beauty__1h56mn38s_ 
As_Good_As_It_Gets 
As_Good_As_It_Gets 
_DivX-ITA__Casablanca_M_CURTIZ_1942_Bogart-bergman_ 
Capote_EN_DVDRiP_XViD-GeT-AW 
_DivX-ITA__Casablanca_M_CURTIZ_1942_Bogart-bergman_ 

我會找到從另一個 相應的匹配(行號)

American beauty.(1h56mn38s) 
As Good As It Gets 
Capote.EN.DVDRiP.XViD-GeT-AW 
[DivX-ITA] Casablanca(M.CURTIZ 1942 Bogart-bergman) 
Quills (2000)(7.4) 

所需的輸出會是這樣的(從參考文件參考電影+行數)::

每個在所述第一文件中的條目的參考文件210
American beauty.(1h56mn38s) 1 
As Good As It Gets 2 
As Good As It Gets 2 
[DivX-ITA] Casablanca(M.CURTIZ 1942 Bogart-bergman) 4 
Capote.EN.DVDRiP.XViD-GeT-AW 3 
[DivX-ITA] Casablanca(M.CURTIZ 1942 Bogart-bergman) 4 

基本上,兩個文件中的條目之間的區別在於某些字符,例如:空格,括號,點等被替換爲下劃線。

有沒有人可以對此有所瞭解?

最良好的祝願,

哈維爾

+0

Tsk tsk tsk,盜版:) – 2010-06-15 09:27:52

回答

0

也許你可以只剝除所有的非期望的字符(來自文件列表的文本文件和)使用的sed?

e.g


ls | sed -e 's/[^a-z0-9]/o/gi' 

或者,如果你想要更多的模糊性,你可以嘗試做處理過的文件名(或標記化版本)一些最不編輯距離。

0

試試這個。這不會是特別快:

#!/bin/bash 
chars='[]() .' 
num=0 
while read -r line 
do 
    ((num++)) 
    num=$(grep --line-number "$line" <(tr "$chars" '_' < movies.reference) | awk -F: '{print $1}') 
    echo "$(sed -n "$num{p;q}" movies.reference) $num" 
done < movies.input 
1

awk將工作:

gawk ' 
    NR == FNR { 
    # read the reference file first, capture the line numbers and transform 
    # the "real" title to one with underscores 
    line[$0] = NR 
    u = $0 
    gsub(/[][ .()]/,"_",u) 
    movie[u] = $0 
    next 
    } 
    $0 in movie { 
    print movie[$0] " " line[movie[$0]] 
    } 
' movies.reference movies.list 

如果連字符也變成了下劃線的正則表達式可以簡化(將/\W/然後)。