Regex 如何使shell脚本在正则表达式中打印最后五天?

Regex 如何使shell脚本在正则表达式中打印最后五天?,regex,bash,shell,sh,Regex,Bash,Shell,Sh,例如,我希望脚本按如下方式打印: 如果今天的日期是2015年1月2日,则我需要以下日期,但它们需要用正则表达式格式化: 2014年12月29日 30/12/2014 31/12/2014 01/01/2015 2015年1月2日 我需要这样的东西[d-d]/[m-m]/[y-y] 这是我尝试过的,但不是我想要的 echo [`date -d '5 day ago' +%m`-`date -d '0 day ago' +%m`]/[`date -d '5 day ago' +%d`-`date -

例如,我希望脚本按如下方式打印:

如果今天的日期是2015年1月2日,则我需要以下日期,但它们需要用正则表达式格式化:

2014年12月29日 30/12/2014 31/12/2014 01/01/2015 2015年1月2日

我需要这样的东西[d-d]/[m-m]/[y-y]

这是我尝试过的,但不是我想要的

echo [`date -d '5 day ago' +%m`-`date -d '0 day ago' +%m`]/[`date -d '5 day ago' +%d`-`date -d '0 day ago' +%d`]/[`date -d '5 day ago' +%y`-`date -d '0 day ago' +%y`]


[31-02]/[12-01]/[14-15]

你能告诉我怎么做吗?

如果我理解这个问题(“例如,我希望脚本像这样打印”):


将从给定日期开始执行。当然,您也可以更改结尾处由“+”打印日期的格式。

如果我理解了问题(“例如,我希望脚本像这样打印”):


将从给定日期开始执行。当然,您也可以更改日期最后由“+”打印的格式。

这是一种基于用户1666959的答案快速获取正则表达式的方法:

#!/bin/bash

monthExp=""
dayExp=""
yearExp=""

div=""
for i in 1 2 3 4 5 ; do
    read month day year < <(date --date="2015/01/02 -${i} day" "+%m %d %Y")
    echo $month $day $year
    monthExp="${monthExp}${div}$month"
    dayExp="${dayExp}${div}$day"
    yearExp="${yearExp}${div}$year"
    div="|"
done

echo "Step 1"
echo $monthExp
echo $dayExp
echo $yearExp
echo

regex="$monthExp\/$dayExp\/$yearExp"

echo "Step 2"
echo $regex
echo

echo "Check"
for i in 1 2 3 4 5 ; do
    date=$(date --date="2015/01/02 -${i} day" "+%m/%d/%Y")
    if [[ "$date" =~ $regex ]]; then
        echo "$date matches"
    else
        echo "$date DOES NOT MATCH"
    fi
done

根据需要重新安排。

这是一种基于用户1666959的答案快速而肮脏地获取正则表达式的方法:

#!/bin/bash

monthExp=""
dayExp=""
yearExp=""

div=""
for i in 1 2 3 4 5 ; do
    read month day year < <(date --date="2015/01/02 -${i} day" "+%m %d %Y")
    echo $month $day $year
    monthExp="${monthExp}${div}$month"
    dayExp="${dayExp}${div}$day"
    yearExp="${yearExp}${div}$year"
    div="|"
done

echo "Step 1"
echo $monthExp
echo $dayExp
echo $yearExp
echo

regex="$monthExp\/$dayExp\/$yearExp"

echo "Step 2"
echo $regex
echo

echo "Check"
for i in 1 2 3 4 5 ; do
    date=$(date --date="2015/01/02 -${i} day" "+%m/%d/%Y")
    if [[ "$date" =~ $regex ]]; then
        echo "$date matches"
    else
        echo "$date DOES NOT MATCH"
    fi
done

根据需要重新排列。

这将产生一个可用的egrep regexp

{
    re=''
    for repart in $({ echo '.header off '; echo "select strftime('%d/%m/%Y', 'now', '-"{5,4,3,2,1}" days');"; } | sqlite3); do
        re="$re|$repart"
    done
    re="(${re:1})"
    echo "$re"
}
结果

(15/11/2014|16/11/2014|17/11/2014|18/11/2014|19/11/2014)

如果要缩小regexp,请查看

这将生成一个可用的egrep regexp

{
    re=''
    for repart in $({ echo '.header off '; echo "select strftime('%d/%m/%Y', 'now', '-"{5,4,3,2,1}" days');"; } | sqlite3); do
        re="$re|$repart"
    done
    re="(${re:1})"
    echo "$re"
}
结果

(15/11/2014|16/11/2014|17/11/2014|18/11/2014|19/11/2014)

如果你想缩小一个regexp,请看一看它们需要用正则表达式格式化为什么?
[31-02]
不是字符串
31
01
、和
02
以及其他“范围”的正则表达式“向我显示一个与前5天匹配的正则表达式”。例如,与“2014年3月15日”前5天匹配的正则表达式将是
1[0-4]/2014年3月
。当前几天的任何一天在不同的月份或不同的年份时,你都可以很容易地看到出现的问题。开玩笑吗?为什么人们总是要求regex解决这个不可能完成的任务?我期待着读一读关于如何用regex做算术的帖子。谢谢大家的宝贵意见。@Jdamian-谢谢大家的支持很好地解释了我的问题。你正确地理解了我要做的事情。它们需要用正则表达式格式化为什么?
[31-02]
不是字符串
31
01
、和
02
的正则表达式,我想他是说@anubhava”显示与前5天匹配的正则表达式”。例如,与“2014年3月15日”前5天匹配的正则表达式将为
1[0-4]/2014年3月
。当前几天的任何一天在不同的月份或不同的年份时,你都可以很容易地看到出现的问题。开玩笑吗?为什么人们总是要求regex解决这个不可能完成的任务?我期待着读一读关于如何用regex做算术的帖子。谢谢大家的宝贵意见。@Jdamian-谢谢大家的支持很好地解释了我的问题。你正确地理解了我的意图。感谢用户1666959的帮助!感谢用户1666959的帮助!