Regex 如何使shell脚本在正则表达式中打印最后五天?
例如,我希望脚本按如下方式打印: 如果今天的日期是2015年1月2日,则我需要以下日期,但它们需要用正则表达式格式化: 2014年12月29日 30/12/2014 31/12/2014 01/01/2015 2015年1月2日 我需要这样的东西[d-d]/[m-m]/[y-y] 这是我尝试过的,但不是我想要的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 -
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的帮助!