使用正規表示式批次重命名但保留一些子字串

使用正規表示式批次重命名但保留一些子字串

在提出這個問題之前我做了很多研究。我找到了使用正則表達式進行批量重命名的不同鏈接,如下所示和其他類似的:

*基於模式的終端機中的批次檔重命名

我的問題是這樣的,我想使用正規表示式進行批次重命名,但我的程式碼不起作用。

我在一個資料夾中有不同的文件,名稱如下:

name_house_1_door.jpg
name_house_2_door.jpg
name_house_3_door.jpg
name_house_4_door.jpg

我想像這樣重命名檔案:

name_house_1.jpg
name_house_2.jpg
name_house_3.jpg
name_house_4.jpg

最接近我想要的程式碼是:

$  rename -v 's/house\_[0-9]\_door/house_[0-9]/'

但正如您應該知道的那樣,第一個檔案被重新命名為:name_house_[0-9].jpg

答案1

一種更簡單的方法是_door使用重命名來刪除:

rename -v 's/_door//' *

這會搜尋_door並取代它,實質上是刪除它。

答案2

  1. 您在表達式的搜尋端轉義了下劃線,而不應該這樣做。
  2. 您需要子搜尋(數字)和占位符來儲存和使用子搜尋的結果。

在 [0-9] 周圍新增括號將建立所需的子搜尋。由於這是第一個子搜索,因此可以在替換端將其稱為 $1。結果如下..

rename -v 's/house_([0-9])\_door/house_$1/' *

希望這可以幫助。

答案3

你需要使用反向引用。字符類別在替換表達式中沒有任何意義。事實上,替換表達式中很少有字元具有特殊意義。我想是這樣的:

rename -v 's/house_([0-9])_door/house_$1/'

(或)

rename -v 's/(house_[0-9])_door/$1/'

另外,-n在實際執行重新命名之前,請使用該標誌來查看會發生什麼。

答案4

這適用於 Fish Shell

for file in *.jpg;  
    mv -n $file (basename $file _door.jpg).jpg; 
end

相關內容