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