正则表达式 - 从EOL找到第n个位置

时间:2014-10-05 20:54:25

标签: regex linux bash perl

我有一个文件名目录,其中缺少点,这标志着文件扩展名的开头:

filename1jpg 
filename2JPG 
filename3MPG

我现在想在行尾的第三个位置之前添加.,以便将文件名重命名为:

filename1.jpg 
filename2.JPG
filename3.MPG

最方便的可能是shell上的rename,但我无法想象这是一个正则表达式。有人能帮助我吗?

5 个答案:

答案 0 :(得分:5)

您可以在文件所在的目录上尝试以下重命名命令。

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

$表示行锚的结束。 ()称为捕获组,用于捕获字符。所以(...)$此捕获组将捕获最后三个字符并将其保存到组索引1.然后匹配的子字符串(最后三个字符)被一个点加上组索引中的字符替换1(最后三个字符)。

答案 1 :(得分:1)

您可以使用这样的正则表达式:

(.*)(...)

<强> Working demo

enter image description here

使用替换你可以拥有:

enter image description here

这个想法是捕获字符串的开头和最后3个字符,因此使用捕获组内容,您将连接像\1这样的点。\2

答案 2 :(得分:1)

使用perl one-liner。

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

或者使用shell重命名:

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

答案 3 :(得分:1)

查找(?<=[^.])(?=[^.]{3}$)
替换.

答案 4 :(得分:1)

以下是替代方式:

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

可以通过删除echo来执行。