gpt4 book ai didi

bash - 自定义日期验证 - BASH - 仅使用 grep 或 awk 等

转载 作者:行者123 更新时间:2023-11-29 09:25:10 26 4
gpt4 key购买 nike

我看到了几个帖子(有些取决于 date -d $xyz 来验证)但我正在尝试创建一个 until 循环,用户应该重新- 提示输入日期格式的值,直到它与自定义日期格式匹配。

我的日期格式(Splunk 需要的格式)是 m/d/yyyy:h:m:smm/dd/yyyy:hh:mm:ss

这意味着,如果 m(月份编号)是一位数字,假设 1 表示一月,那么 1 01 值可以用于日期格式,但 000 不是有效值。取值范围为01-to->121-to->12但不大于12。

同样,同样的规则适用于d(天数),它可以是01-to->10-to->311- to->31 但不是 00 或超过 31 和所有其他 yyyy(年),h(小时),m(分钟),s(秒)部分。

在 BASH 中执行此验证的最小代码(混淆没问题)可能是什么? date -d ??? 似乎没有为日期/时间提供这种自定义类型的验证!

好的,我可以编写一个 verifyDateFormatfunc() 来执行此操作,但我知道有些人已经编写了一个单行代码/最小代码段来确定这一点。 grep -f ..(其中一堆正则表达式逐行列出所有可能的组合,如果我按照这个,主要代码看起来会非常小吗?因为位于 -f 中的模式grep 的文件 对用户是透明的)或者为值范围创建映射函数(基于分隔符)?

可能的值:

1/03/2017:23:0:15
02/4/2017:0:1:2
09/05/2017:10:10:0
10/6/2017:12:14:16

最佳答案

这是一个邪恶的扩展正则表达式 (POSIX ERE):

^([1-9]|1[0-2]|0[1-9])/([1-9]|0[1-9]|[12][0-9]|3[01])/[0-9]{4}:([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$

这将测试您指定的日期/时间模式(m/d/yyyy:h:m:smm/dd/yyyy:hh:mm:ss),其中:

  • 月份:1-1201-12
  • 天:1-3101-31
  • 年份:0000-9999
  • 小时:0-2300-23
  • 分钟:0-5900-59
  • 第二个:0-5900-59

您可以在 awk 程序 中使用,如果(第一)行是有效的日期/时间(包裹在为方便起见,测试第一个参数的 shell 函数):

#!/bin/bash
is_datetime_valid() {
awk '{exit $0!~"^([1-9]|1[0-2]|0[1-9])/([1-9]|0[1-9]|[12][0-9]|3[01])/[0-9]{4}:([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$"}' <<<"$1"
}

或者,如果您更喜欢bash 解决方案(在 bash v3.0+ 中支持 ERE):

#!/bin/bash
is_datetime_valid() {
local pat='^([1-9]|1[0-2]|0[1-9])/([1-9]|0[1-9]|[12][0-9]|3[01])/[0-9]{4}:([0-9]|0[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$'
[[ $1 =~ $pat ]]
}

你可以像这样使用它:

if is_datetime_valid "1/03/2017:23:0:15"; then
# yup, it's valid
else
# ney, it's invalid
fi

测试了几个例子:

#!/bin/bash
samples=(
"1/03/2017:23:0:15" "02/4/2017:0:1:2" "09/05/2017:10:10:0" "10/6/2017:12:14:16"
"00/03/2017:23:0:15" "1/33/2017:23:0:15"
)
for dt in "${samples[@]}"; do
if is_datetime_valid "$dt"; then
echo "$dt is valid"
else
echo "$dt is invalid"
fi
done

给予:

1/03/2017:23:0:15 is valid
02/4/2017:0:1:2 is valid
09/05/2017:10:10:0 is valid
10/6/2017:12:14:16 is valid
00/03/2017:23:0:15 is invalid
1/33/2017:23:0:15 is invalid

关于bash - 自定义日期验证 - BASH - 仅使用 grep 或 awk 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46777780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com