如何转义组标识符之间的数字

如何转义组标识符之间的数字

我正在使用该实用程序改名重命名多个文件,我不知道如何转义组标识符之间的数字。这一定是基本的,但我从未遇到过这种情况,而且我的直觉无法帮助我找到正确的转义字符。

我想将文件名中的任何数字替换为23.我尝试过以下方法:

rename -n 's/(.*)([0-9]{2})(.*)/$1"23"$3/' *

$ rename -n 's/(.*)([0-9]{2})(.*)/$1"23"$3/' *
rename(Request22Message.json, Request"23"Message.json)
rename(Response22ExpectedMessage.json, Response"23"ExpectedMessage.json)
rename(Response22Message.json, Response"23"Message.json)

在这种情况下,点可能被视为连接字符:

$ rename -n 's/(.*)([0-9]{2})(.*)/$1.23.$3/' *
rename(Request22Message.json, Request.23.Message.json)
rename(Response22ExpectedMessage.json, Response.23.ExpectedMessage.json)
rename(Response22Message.json, Response.23.Message.json)

不。

答案1

这实际上并不是转义数字的问题 - 这是消除$123作为捕获组引用的歧义的问题123。这个案例在perlre这种情况在下面的文档警告 \1 而不是 $1

如果你尝试做

s/(\d+)/\1000/;

你不能通过说 来消除歧义\{1}000,但你可以用 来修复它${1}000

所以,例如

rename -n 's/(.*)([0-9]{2})(.*)/${1}23$3/' *.json

或(为了对称)

rename -n 's/(.*)([0-9]{2})(.*)/${1}23${3}/' *.json

使用字符串连接运算符.,但这需要添加执行标志:

rename -n 's/(.*)([0-9]{2})(.*)/$1."23".$3/e' *.json

相关内容