0

我用正则表达式匹配表单上的日期01/Jan/2000:23:59:59。我设法使用 Notepad++ 的正则表达式解释器匹配模式,使用以下正则表达式:

[1-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]

不幸的是,我需要用 bash 来做这件事。恐怕现在不能选择 AWK。因此,我尝试将上述正则表达式转换为 bash 将以相同方式解释的内容。到目前为止,我想出了这个:

[1-3][0-9]/[A-Z][a-z]\{2\}/(19|20)[0-9]\{2\}:[0-2][0-9]:[0-5][0-9]:[0-5][0-9]

我正在使用的完整命令是

expr "$line" : '\([1-3][0-9]/[A-Z][a-z]\{2\}/(19|20)[0-9]\{2\}:[0-2][0-9]:[0-5][0-9]:[0-5][0-9]\)'

where$line包含我需要从中提取日期的字符串。不幸的是,我的 bash 版本的正则表达式不起作用。我尝试了不同的东西,比如转义/:,但我似乎无法让它工作。我究竟做错了什么?

4

1 回答 1

1

唯一的问题是您的第一个模式 [1-3]。它应该是 [0-3]。

[[ $DATE =~ [0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9] ]]

此外,在某些早期版本的 Bash 中,您必须将其存储在变量中:

RE='[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]'
[[ $DATE =~ $RE ]]

例子:

> DATE='01/Jan/2000:23:59:59'
> [[ $DATE =~ [0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9] ]] && echo Match.
Match.

重击 3.0:

> echo "$BASH_VERSION"
3.00.0(1)-release
> DATE='01/Jan/2000:23:59:59'
> RE='[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]'
> [[ $DATE =~ $RE ]] && echo Match.
Match.

如果你想在循环中应用它,你可以有这样的东西:

RE='[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]'
while read -r LINE; do
    [[ $LINE =~ $RE ]] && echo "Match: $LINE"
done < date_list.txt

顺便说一句,如果你想完全匹配整个单词,只需在模式的开头和结尾使用 add^和:$

[[ $DATE =~ ^[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]$ ]]

要在行上提取匹配项,请使用()and BASH_REMATCH

[[ $DATE =~ .*([0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]).* ]] && echo "${BASH_REMATCH[1]}"
于 2013-09-10T09:45:08.203 回答