awk
可能是更好的候选者,但当你要求sed
解决方案时…
使用GNU sed
,您可以使用shell 执行成功替换的结果,并使用结果替换模式空间,这要归功于替换命令的e
标志.使用GNU coreutils
if your line does not contain 102 formatting controls and no quotes中的date
实用程序的示例:
$ printf 'M;12345678900000;Z;;FEWO;F;010622;0.0;;;1.00;0.00;1.25;Y;;;XXX' |
sed -E 's/(([^;]*;){6})(..)(..)(..)(.*)/date -d "\5\4\3 -3 days" +"\1%d%m%y\6"/e'
M;12345678900000;Z;;FEWO;F;290522;0.0;;;1.00;0.00;1.25;Y;;;XXX
这将用生成预期输出的date
命令替换输入行.以您的示例为例:
date -d "220601 -3 days" +"M;12345678900000;Z;;FEWO;F;%d%m%y;0.0;;;1.00;0.00;1.25;Y;;;XXX"
注意从日-月-年到年-月-日的重新排序.然后它由shell 执行,这要归功于e
标志.
如果该行的其余部分可以被解释为date
的格式化命令,我们需要一些更复杂的东西:
$ printf 'M;12345678900000;Z;;FEWO;F;010622;0.0;;;1.00;0.00;1.25;Y;;;XXX' |
sed -E 'h
s/([^;]*;){6}(..)(..)(..).*/date -d "\4\3\2 -3 days" +%d%m%y/e
G;s/(.*)\n(([^;]*;){6}).{6}(.*)/\2\1\4/'
M;12345678900000;Z;;FEWO;F;290522;0.0;;;1.00;0.00;1.25;Y;;;XXX
将包含输入行的图案空间复制到保持空间(h
).
将整行替换为date -d "yymmdd -3 days" +%d%m%y
,其中yymmdd
是年-月-日格式的日期(在您的示例中为220601
).结果由shell 执行,模式空间被替换为结果,这要归功于e
标志.在您的示例中,它现在包含290522
.
将换行符和保留空格附加到模式空格(G
).在这一点上,模式空间包含(使用您的示例):
290522\nM;12345678900000;Z;;FEWO;F;010622;0.0;;;1.00;0.00;1.25;Y;;;XXX
最后,用您想要的最终格式替换模式空间.