我一直在玩 cygwin 中重命名工具的 perl 实现,最终通过从 cpan 安装使其工作。
我已经很长时间没有玩这些东西了,所以我对我的正则表达式东西有点生疏了。
基本上我只是想重命名一堆表单的文件夹
[2022-10-10] This is a Test - This is a Test (some stuff) [393933939339]
或者
[2022] This is a Test - This is a Test (some stuff) [393933939339]
并将开头处的内容移至[]
末尾,这样看起来就像
This is a Test - This is a Test (some stuff) [393933939339] [2022-10-10]
或者
This is a Test - This is a Test (some stuff) [393933939339] [2022]
我已经弄清楚如何使用位置参数来做到这一点,但我很难使用模式匹配来做到这一点[]
rename -n 's/^(.{12})(.*)$/$2 $1/'
将为具有完整日期的文件夹执行此操作,显然,但不适用于仅包含一年的文件夹。理想情况下,我想要一个表达式来处理所有这些。
我认为这可能会因为 [] 被视为运算符而变得复杂,因此可能需要以某种方式转义。
任何帮助表示赞赏。
答案1
我认为这可能会因为 [] 被视为运算符而变得复杂,因此可能需要以某种方式转义。
正是如此。在 RE 中转义字符的标准方法是在其前面添加反斜杠\
。所以,
rename -n 's/^(\[.*?])\s*(.*)/$2 $1/s' '['*
它一直受到推崇的应该包含模式替换的尾随s
修饰符,因为这允许模式将换行符作为字符进行匹配(毕竟它们在文件名中是有效的)。另外,通过使用作为文件名模式,将考虑的文件集限制为可以转换的文件集(这会忽略以 开头的文件名-v
等,这些文件名将由 shell 传递并作为有效参数选项进行处理);你也可以使用。rename
'['*
./*
答案2
我会做什么:
$ rename -n 's/^(\[.*?\])(.*)/$2 $1/' *393933939339*
rename([2022] This is a Test - This is a Test (some stuff) [393933939339], This is a Test - This is a Test (some stuff) [393933939339] [2022])
正则表达式匹配如下:
节点 | 解释 |
---|---|
^ |
字符串锚点的开头 |
( |
分组并捕获到 \1: |
\[ |
[ |
.*? |
除 \n 之外的任何字符(0 次或多次(匹配尽可能少的数量)) |
\] |
] |
) |
\1 结尾 |
( |
分组并捕获到 \2: |
.* |
除 \n 之外的任何字符(0 次或多次(匹配尽可能多的数量)) |
) |
\2 结尾 |