我有包含两个日期的数据行。我想将第一个日期的格式从mm/dd/yy更改为20yy-mm-dd。
由于我只想更改第一个日期,因此我使用perl代替sed,因为sed没有延迟匹配。
以下给出了错误的结果
echo test,10/02/20,test2,11/03/20,test3 | perl -pe 's/(.*?)(..)\/(..)\/(..)(.*)/\120\4-\2-\3\5/'
# P20-10-02,test2,11/03/20,test3
Run Code Online (Sandbox Code Playgroud)
如果我在\1它工作正常后添加一个空格,但我不希望输出中有额外的空间:
echo test,10/02/20,test2,11/03/20,test3 | perl -pe 's/(.*?)(..)\/(..)\/(..)(.*)/\1 20\4-\2-\3\5/'
# test, 2020-10-02,test2,11/03/20,test3
Run Code Online (Sandbox Code Playgroud)
问题似乎是它读取的\120不是 \1 + 20 而是对组 120(不存在)的引用。
您可以为您的案例使用这个优化的更简单的正则表达式,因为您不需要使用超过 3 个捕获组来避免在替换中反向引用后出现任何数字:
perl -pe 's~(\d{2})/(\d{2})/(\d{2})~20$3-$1-$2~' <<< "$s"
Run Code Online (Sandbox Code Playgroud)
您的原始正则表达式可以使用以下方法解决:
s='test,10/02/20,test2,11/03/20,test3'
perl -pe 's~(.*?)(..)/(..)/(..)(.*)~${1}20$4-$2-$3$5~' <<< "$s"
Run Code Online (Sandbox Code Playgroud)
test,2020-10-02,test2,11/03/20,test3
Run Code Online (Sandbox Code Playgroud)
将您的反向引用标记为${n}代替$n或\n使用它们旁边的数字来适当地标记您的反向引用。