我有一个像"M;12345678900000;Z;;FEWO;F;010622;0.0;;;1.00;0.00;1.25;Y;;;XXX"
这样的字符串,其中第七个字段是一个ddmmyy格式的日期。我需要用相同格式的日期替换此字段,但要早3天。
我尝试了以下操作:
echo "M;12345678900000;Z;;FEWO;F;010622;0.0;;;1.00;0.00;1.25;Y;;;XXX" | sed "s/;\([0-3][0-9][0-1][0-9]2[0-9]\);/;$(date -d "$(date -d \1 '+%d%m%y') - 3 days" '+%d%m%y');/"
问题是,我可以使用引用(\1)或脚本($(date..)),但我不能创建一个两者都能工作的工作示例。我想这是引号的问题,但我也无法正确地逃避它们。另外,像-E, -e, -r
这样的sed开关也帮不了我。我希望看到一个工作的sed示例,但我也在考虑用awk解决这个问题。
任何帮助感激不尽。
4条答案
按热度按时间2ul0zpep1#
使用awk:
当然,使用GNU awk可以更快。
syqv5f0l2#
我发现
dateutils
对于日期/时间操作通常更方便,例如:使用来自coreutils的paste
和cut
(假设数据来自infile
):x6h2sr283#
使用shell和日期:date需要输入日期格式为
mm/dd/yy
,因此需要进行一些字符串操作。5kgi1eie4#
awk
可能是一个更好的候选人,但当你要求一个sed
解决方案...使用GNU
sed
,您可以使用shell执行成功替换的结果,并使用结果替换模式空间,这要归功于替换命令的e
标志。使用GNUcoreutils
中的date
实用程序的示例,如果您的行不包含date
控件并且没有引号:这将用
date
命令替换输入行,以生成预期的输出。以你为例:注意从日-月-年到年-月-日的重新排序。然后,由于
e
标志,它由shell执行。如果这一行的其余部分可以被
date
解释为格式化命令,我们需要一些更复杂的东西:h
)。date -d "yymmdd -3 days" +%d%m%y
,其中yymmdd
是年-月-日格式的日期(在您的示例中为220601
)。结果由shell执行,并且由于e
标志,模式空间被结果替换。在您的示例中,它现在包含290522
。G
)中添加一个换行符和保持空间。此时,模式空间包含(在您的示例中):