Regex 从文件名中减去1的正则表达式
在正则表达式中,我需要从文件名中减去1 重命名:Regex 从文件名中减去1的正则表达式,regex,unix,Regex,Unix,在正则表达式中,我需要从文件名中减去1 重命名: W00524P.0210032021 到 需要从点后的第3和第4个字符中减去1。我有一个用于正则表达式的pflow编辑器: ^........(..)(..)(..)(....) 我使用以下方法无法获得预期结果: W00524P.%{1}%{2-1}%{3}%{4} 此表达式导致W00524P.02%{2-1}032021。您能为此提供正则表达式吗?您可能对正则表达式的含义有错误的理解 “正则表达式”作为一种模式,允许你问这样一个问题:“这
W00524P.0210032021
到
需要从点后的第3和第4个字符中减去1。我有一个用于正则表达式的pflow编辑器:
^........(..)(..)(..)(....)
我使用以下方法无法获得预期结果:
W00524P.%{1}%{2-1}%{3}%{4}
此表达式导致
W00524P.02%{2-1}032021
。您能为此提供正则表达式吗?您可能对正则表达式的含义有错误的理解
“正则表达式”作为一种模式,允许你问这样一个问题:“这个字符串与这个模式匹配吗?”这个问题本质上是你唯一可以问的问题
更复杂的正则表达式库(例如您在这里明确使用的正则表达式库)允许您将(…)
或\(…\)
括号括在表达式的各个部分,从而提取匹配字符串的特定部分
但就是这样:正则表达式不能做任何事情。这是钥匙啊哈
使用这个regexp库的系统(我知道你已经用爱奥尼亚appflow
标记了它-我不知道这是什么)当然会对这个匹配的结果做些什么,但这是一个需要询问该系统文档的问题。也就是说,要说你可能在问一个无关紧要的问题,还有很长的路要走
(具体地说,您正在使用的regexp库似乎使用
%{n}
来引用第n个匹配项;编写%{2-1}
,如果它有任何意义的话,将引用第2-1个匹配项,并且…正如@Norman Gray在他的回答中指出的那样,您不能用正则表达式进行数学运算
尽管如此,还是存在特定于语言的扩展。例如,Perl有一个e
标志来执行搜索和替换的替换部分中的代码
下面是一个shell示例,其中包含一个Perl one liner,它可以满足您的需要:
$ ls W00*
W00524P.0210032021
$ source=`ls W00*`
$ destination=`echo ${source} | perl -p -e 's/(?=.{8}$)(..)/sprintf("%02d", $1-1)/e'`
$ echo mv ${source} ${destination}
mv W00524P.0210032021 W00524P.0209032021
$ mv ${source} ${destination}
$ ls W00*
W00524P.0209032021
$
说明:
- 使用反勾号设置
变量以执行source
ls
- 使用带管道的回标记设置
变量:目标
-输出源文件名echo${source}
:perl-p-e的/(?=.{8}$)(..)/sprintf(“%02d”,$1-1)/e'
- 执行perl
搜索并替换为s/../../../e
标志e
-正向前瞻以匹配从末尾看到的第8个字符(?=.{8}$)
-使用两个字符捕获组1(在我们的示例中为(..)
)10
-将一个数字格式化为两位数,前导为零,值为sprintf(“%02d”,$1-1)
,例如,捕获组值减去1$1-1
- 执行perl
-这只是一个演示mv的样子echo mv${source}${destination}
-实际文件重命名mv${source}${destination}
$ ls W00*
W00524P.0210032021
$ source=`ls W00*`
$ destination=`echo ${source} | perl -p -e 's/(?=.{8}$)(..)/sprintf("%02d", $1-1)/e'`
$ echo mv ${source} ${destination}
mv W00524P.0210032021 W00524P.0209032021
$ mv ${source} ${destination}
$ ls W00*
W00524P.0209032021
$