2013-08-23 56 views
0

重命名我有很多的文件看起來像這樣:與模式

"THIS IS my file.txt" 
"THIS IS My file.txt" 
"THIS IS m file.txt" 
"THIS IS M file.txt" 

所以基本上,如果我嘗試來形容它,文件名由兩個部分組成,一個是大寫,其他較低情況(儘管第二部分的第一個字母也可以是大寫)。單詞可以由一個字符組成。當有選擇時,大寫的單個字符詞被認爲是第一部分。

我想提取由大寫字母組成的文件名的第一部分,將它們改爲小寫字母(只用第一個字母作爲大寫字母),然後用連字符將其與其餘字母分開。

所以我期待的結果是:

"This Is - my file.txt" 
"This Is - My file.txt" 
"This Is - m file.txt" 
"This Is M - file.txt" 

我至今是:

rename 's/^(([A-Z]{2,}|)+)(.*)/\u\L$1\E - $3/g' * 

但也有相當與它(的幾個問題一個字母大寫單詞不要不匹配,只有第一個字被大寫)。

+0

這不是如何Perl'rename'函數起作用。根據[doc](http://perldoc.perl.org/functions/rename.html)重命名需要兩個參數,_oldname _,_ newname_。你有兩個問題需要解決:1)找出分裂發生的位置; 2)改變大小寫並插入連字符。我建議你分開處理它們以開始。 –

+1

@JimGarrison我懷疑他在說linux中的'rename'命令行工具。 – TLP

+0

對不起,我沒有使用perl的重命名功能,而是使用linux中的重命名工具。根據它的手冊頁,它使用perl regex。是的,我的第一個問題是如何使用正則表達式模式匹配來區分它們,但我沒有如上面所說的那樣對一個字母單詞進行分類。 – Simhor

回答

2

我認爲你正在尋找的正則表達式是:

s/^((?:[A-Z]+)+)/(join " ", map ucfirst, split " ", lc $1) . " - "/e 

我測試它像這樣:

$ perl -pe 's/^((?:[A-Z]+)+)/(join " ", map ucfirst, split " ", lc $1) . " - "/e' <<eoq 
THIS IS my file.txt 
THIS IS My file.txt 
THIS IS m file.txt 
THIS IS M file.txt 
eoq 

下面是輸出:

This Is - my file.txt 
This Is - My file.txt 
This Is - m file.txt 
This Is M - file.txt 
+0

是的,它似乎工作!小心解釋一下?我不知道我可以做正則表達式中的函數... – Simhor

+0

正則表達式結尾的/ e標誌表示替換值是一個perl表達式,應該被忽略,而不是僅僅插入。 – kdkeck

+0

(謝謝,但我的意思是解釋正則表達式的內容)。我不知道什麼是「?:,join,map,ucfirst,split,lc,e」的意思。 – Simhor