Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从文件名中减去1的正则表达式_Regex_Unix - Fatal编程技术网

Regex 从文件名中减去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。您能为此提供正则表达式吗?您可能对正则表达式的含义有错误的理解 “正则表达式”作为一种模式,允许你问这样一个问题:“这

在正则表达式中,我需要从文件名中减去1

重命名:

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
  • echo mv${source}${destination}
    -这只是一个演示mv的样子
  • mv${source}${destination}
    -实际文件重命名

什么是regrex的pflow编辑器?Regex无法执行算术。您需要使用某种形式的脚本捕获结果,并在那里执行算法。说得好。我添加了一个带有特定语言扩展名的答案,即perl和execute in replace。@sri keerthana:这符合您的需要吗?有问题吗?愿意接受这个答案吗?请参见答案旁边的灰色复选标记。
$ 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
$