2014-10-05 169 views
1

我有在點丟失文件名的目錄,這標誌着該文件擴展名的開頭找到第n個位置:正則表達式從EOL

filename1jpg 
filename2JPG 
filename3MPG 

我現在想的第三位前添加.從行的末尾,這樣的文件名會被重命名爲:

filename1.jpg 
filename2.JPG 
filename3.MPG 

最方便的可能是與rename的外殼,但我無法想象,一個正則表達式。有人能幫我嗎?

回答

1

使用perl單線程。

perl -e 'rename $_, s/\.?(...)$/.$1/r for <*>' 

或者使用shell重命名:

rename 's/\.?(...)$/.$1/' * 
+1

工作,重命名不是。所以我接受你的回答,謝謝。 – royskatt 2014-10-05 21:07:59

5

您可以在文件所在的目錄下嘗試下面的rename命令。

rename 's/(...)$/.$1/' * 

$意味着行錨的結束。並且()稱爲用於捕獲字符的捕獲組。所以(...)$這個捕獲組將捕獲最後三個字符並將其保存到組索引1中。然後匹配的子字符串(後三個字符)被一個點加上組索引1(後三個字符)中的字符替換。

+0

嗯,你想介紹一下這個正則表達式嗎? – royskatt 2014-10-05 20:59:14

+1

當然..只是一分鐘。 – 2014-10-05 20:59:27

+0

一個明白了。你匹配來自EOL的最後3個字符,將它保存在$ 1中,然後用'。'替換它。 + $ 1 – royskatt 2014-10-05 21:02:43

1

你可以使用這樣的正則表達式:

(.*)(...) 

Working demo

enter image description here

使用替代你可以有這樣的:

enter image description here

這個想法是捕獲字符串的開始和最後3個字符,所以使用捕獲組內容,您將連接一個點,如\1\2

1

查找(?<=[^.])(?=[^.]{3}$)
更換.

1

這裏的另一種方式:

awk '{print $1, $1}' | awk '{$2=gensub(/...$/,".\\0","",$2); print}' | xargs -n2 echo mv 

它可以通過滴速執行。