Bash Awk-仅从文本文件中筛选具有特定格式的日期

Bash Awk-仅从文本文件中筛选具有特定格式的日期,bash,macos,awk,Bash,Macos,Awk,我在macOS上有一个包含许多行文本的.txt文件。我想只过滤日期,并有他们保存在一个新的文本文件中的外观顺序行 然而,我对所有的日期都不感兴趣,只对那些完整的日期感兴趣,比如2019年3月2日,以及那些天数低于13天的日期感兴趣。E01…12 然后,我希望删除日期和月份相同的日期,如2019年1月1日和2019年2月2日等 如何使用awk或bash中的类似软件实现这一点?如果选择perl: 如果m:(\d\d)/(\d\d)/(\d\d\d\d):&&&$1=13的(完整)日期你能解决这个问题

我在macOS上有一个包含许多行文本的.txt文件。我想只过滤日期,并有他们保存在一个新的文本文件中的外观顺序行

然而,我对所有的日期都不感兴趣,只对那些完整的日期感兴趣,比如2019年3月2日,以及那些天数低于13天的日期感兴趣。E01…12

然后,我希望删除日期和月份相同的日期,如2019年1月1日和2019年2月2日等

如何使用
awk
或bash中的类似软件实现这一点?

如果选择perl:

如果m:(\d\d)/(\d\d)/(\d\d\d\d):&&&$1<13&&$1!=$2'dates.txt>newdates.txt

此格式假定为
/dd/mm/yyyy

注意,对于正则表达式匹配,我使用了
m::
符号,而不是通常的
/
。因此,我不需要逃避日期中的斜杠。

删除文本文件中的日期 以下命令将删除表单的所有日期✱ <代码>aa/bb/cccc其中
aa
=
bb
<13。原始文件将被复制到
yourFile.txt.bak
作为备份,带有删除日期的新文本将覆盖旧文件

sed -E -i.bak 's:\b(0[0-9]|1[0-2])/\1/[0-9]{4}\b::g' yourFile.txt
如果您想插入某些内容而不是仅仅删除日期,您可以通过在两个日期之间写入替换项来完成。例如,
sed…'s:…:deleted date:/g'…
将用文本
deleted date
替换每个匹配的日期

✱ 请注意,日期格式是
dd/mm/yyyyy
还是
mm/dd/yyyy
与您的标准无关,因为您只对
dd
mm
相等的日期感兴趣

从文本文件中提取特定日期 如果您不想删除,而只想提取注释中提到的特定日期,可以使用以下命令

grep -Eo '\b([0-9]{2}/){2}[0-9]{4}\b' yourFile.txt | awk -F/ '$1<13 && $1!=$2'

grep-Eo'\b([0-9]{2}/){2}[0-9]{4}\b'yourFile.txt | awk-F/'$1请在您的帖子中发布更清晰的输入和预期输出示例,然后让我们知道。请使用dd/mm/yyyy或mm/dd/yyyyy?dd/mm/yyyyyy格式。谢谢您的回答。我感兴趣的是完整的日期,日期数低于13天,实际上,日期数不等于天和月。因此,我希望从文件中删除2019年1月1日和2019年12月12日等日期。包含文本的文件应按照上述标准的出现顺序列出日期,其中每行仅包含一个日期。您的代码就是这样做的吗?我现在无法查看它,因为我不在我的MacBook上。@TilHund这不是我理解你问题的方式。很好,你说得更清楚了。你应该在你的问题中添加澄清。我在回答中添加了另一个命令,该命令符合您在评论中的要求。谢谢您,Socowi,您的修改。更新后的命令似乎正常工作,但它确实提取了日期,如1978年2月28日(格式始终为
dd/mm/yyyy
)。您的命令似乎无法正确删除
dd>=13的(完整)日期你能解决这个问题吗?@TilHund正如命令下的文本所指出的,我假设格式是
mm/dd
而不是
dd/mm
。我编辑答案。谢谢你,索科维。我看到你采用了另一种形式。对不起,我应该在我的第一篇文章中说得更清楚些,但你说得对它现在像魅力一样工作!