String 如何从Shell中的字符串中剪切日期?

String 如何从Shell中的字符串中剪切日期?,string,shell,sed,filtering,String,Shell,Sed,Filtering,我在一个.txt文件中得到了这样的字符串列表 asdafdgdhjhgk.de/dsafdfdfgfdggfgg - Abgelaufen seit 26.11.2076 14:08 (seit 12345 Tagen) 现在我想从字符串中删除日期,如:26.11.2076 所有这些都必须在Shell脚本中发生,因此我通过cut或sed将是一个好主意,但我在互联网上没有找到答案。您可以使用GNU grep和-E和扩展的regEx支持,使用-E,--extended regexp标志 $ gre

我在一个.txt文件中得到了这样的字符串列表

asdafdgdhjhgk.de/dsafdfdfgfdggfgg - Abgelaufen seit 26.11.2076 14:08 (seit 12345 Tagen)
现在我想从字符串中删除日期,如:
26.11.2076


所有这些都必须在Shell脚本中发生,因此我通过
cut
sed
将是一个好主意,但我在互联网上没有找到答案。

您可以使用
GNU grep
-E
和扩展的
regEx
支持,使用
-E,--extended regexp
标志

$ grep -Eo "[[:digit:]]{2}.[[:digit:]]{2}.[[:digit:]]{4}" <<< "asdafdgdhjhgk.de/dsafdfdfgfdggfgg - Abgelaufen seit 26.11.2076 14:08 (seit 12345 Tagen)"
26.11.2076

如果从开始到日期,日志/线路的结构相似,则可以使用以下内容:

awk '{print $5}' input


注意:这可能会在2月份中断。

说到文本解析,我几乎总是更喜欢Perl

每行有多个逗号分隔的匹配项:

perl -ne '@_=/((?:\d\d\.){2}\d{4})/g and print join(",", @_), "\n"' file
连接到单个列中的每行有多个匹配项:

perl -ne 'while (/((?:\d\d\.){2}\d{4})/g) {print "$&\n";}' file
第一场比赛:

perl -ne '/((?:\d\d\.){2}\d{4})/ and print "$1\n"' file
如果日期后面跟时间,则将
(?:\d\d:\d\d)
添加到正则表达式中,例如

/((?:\d\d\.){2}\d{4})(?: \d\d:\d\d)/
这将使比赛更加严格。注意,
(?:)
是一个

我还喜欢
grep
-p
选项,它支持与Perl兼容的正则表达式:

grep -o -P '(?:\d\d\.){2}\d{4}' file
但有些实现可能不支持它:

这是高度实验性的,grep-p可能会警告未实现的特性


(grep的手册页)。

您尝试了什么?你在网站上发现类似的问题了吗?我相信你可以在这里找到很多。你想只从一个文件或上面字符串的一个实例中提取日期吗?如果日期总是在同一个字段中,你可以使用awk来提取字段<代码>$echo'asdafdgdhjhgk.de/dsafdfgfdggg-Abgelaufen seit 26.11.2076 14:08(seit 12345 Tagen)'awk'{print$5}'很难从1的样本中推断出一种“像这样”的通用格式。发布几行输入和相关的预期输出,以及您迄今为止尝试的内容,请参阅。这难道不允许打印
32:13:2016
!OP刚刚要求拔牙?而且不是格式良好的提取。据了解,他在输入文件中的日期格式正确。OP尚未告诉我们他想要什么,但这将与0123456789匹配,并且其他内容肯定不是OP想要的(提示:
是一个重元字符)。顺便说一句,我也没有投反对票,只是说。。。
/((?:\d\d\.){2}\d{4})(?: \d\d:\d\d)/
grep -o -P '(?:\d\d\.){2}\d{4}' file