Regex 在组引用后添加数字

Regex 在组引用后添加数字,regex,perl,sed,Regex,Perl,Sed,我有一行数据,包括两个日期。我想把第一个日期的格式从年月日改为20yy-mm-dd。 因为我只想更改第一个日期,所以我使用perl而不是sed,因为sed没有延迟匹配 下面给出了错误的结果 回波测试,20年2月10日,20年3月11日,测试2,测试3 | perl-pe的s/*?…\/…\/…\/…*/\120\4-\2-\3\5/' P20-10-02,测试2,11/03/20,测试3 如果在\1之后添加一个空格,效果很好,但我不希望在输出中添加额外的空格: 回波测试,20年2月10日,20年

我有一行数据,包括两个日期。我想把第一个日期的格式从年月日改为20yy-mm-dd。 因为我只想更改第一个日期,所以我使用perl而不是sed,因为sed没有延迟匹配

下面给出了错误的结果

回波测试,20年2月10日,20年3月11日,测试2,测试3 | perl-pe的s/*?…\/…\/…\/…*/\120\4-\2-\3\5/' P20-10-02,测试2,11/03/20,测试3 如果在\1之后添加一个空格,效果很好,但我不希望在输出中添加额外的空格:

回波测试,20年2月10日,20年3月11日,20年3月11日,测试3 | perl-pe's/*?..\/..\/..\/..*/../..*/\1 20\4-\2-\3\5/' 测试,2020-10-02,测试2,11/03/20,测试3 问题似乎是,它读取的\120不是\1+20,而是对不存在的组120的引用。

您可以在您的案例中使用此优化的更简单的正则表达式,因为您不需要使用超过3个捕获组来避免在子项中反向引用后的任何数字:

perl -pe 's~(\d{2})/(\d{2})/(\d{2})~20$3-$1-$2~' <<< "$s"
使用背面引用旁边的数字适当标记背面引用时,请将背面引用标记为${n},而不是$n或\n。

您可以使用此优化的更简单的正则表达式,因为您不需要使用超过3个捕获组来避免子项中背面引用后的任何数字:

perl -pe 's~(\d{2})/(\d{2})/(\d{2})~20$3-$1-$2~' <<< "$s"

当使用后面的数字适当地标记后向引用时,请将后向引用标记为${n},而不是$n或\n。

需要进一步调整。你可以代替。。使用\d{2}或甚至[0-9]{2}\d匹配一大堆你不希望在公历的数字日期中看到的字符。前导。*?和尾部。*是多余的。它们没有做任何有用的事情,只会使代码复杂化。没错@TLP它可以使用perl-pe的~[0-9]{2}/[0-9]{2}/[0-9]{2}~20$3-$1-$2~'位进一步调优来完成。你可以代替。。使用\d{2}或甚至[0-9]{2}\d匹配一大堆你不希望在公历的数字日期中看到的字符。前导。*?和尾部。*是多余的。它们没有做任何有用的事情,只会使代码复杂化。没错@TLP它可以使用perl-pe的~[0-9]{2}/[0-9]{2}/[0-9]{2}~20$3-$1-$2~”来完成,perl希望您在替换端使用反向引用符号\1已经有一段时间了。您不会收到\1更好地写为$1的警告,因为\120被视为八进制字符,而不是大写字母P请参见。因为替换端是一个双引号上下文,所以双引号内容首先发生。在Perl填充捕获之前,\120已经是“P”。@RyszardCzech backreference不是我知道的术语。因此,当我搜索我的问题的答案时,我没有找到你提到的答案。此外,下面答案中的最终正则表达式甚至不需要任何类似${1}的技术,即perl-pe的~[0-9]{2}/[0-9]{2}/[0-9]{2}~20$3-$1-$2~”perl希望你在替换端使用反向引用符号\1已经有一段时间了。您不会收到\1更好地写为$1的警告,因为\120被视为八进制字符,而不是大写字母P请参见。因为替换端是一个双引号上下文,所以双引号内容首先发生。在Perl填充捕获之前,\120已经是“P”。@RyszardCzech backreference不是我知道的术语。因此,当我搜索我的问题的答案时,我没有找到你提到的答案。此外,下面答案中的最终正则表达式甚至不需要任何类似${1}的技术,即perl-pe的~[0-9]{2}/[0-9]{2}/[0-9]{2}~20$3-$1-$2~'
test,2020-10-02,test2,11/03/20,test3