使用正则表达式批量重命名但保留一些子字符串

使用正则表达式批量重命名但保留一些子字符串

在提出这个问题之前,我做了很多研究。我找到了不同的链接,可以使用正则表达式进行批量重命名,例如:

*基于模式,在终端中批量重命名文件

我的问题是这样的,我想使用正则表达式进行批量重命名,但我的代码不起作用。

我在一个文件夹中有不同的文件,其名称如下:

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

相关内容