我目前正在使用此命令,
cal $month $year | sed -n '1,2p'
cal $month $year | sed -n '3,$p' |
sed -n '/'$day'/{s/.*\('$day'.*\)/\1/p; :a; n; p; ba; }'
它给了我这个输出
March 2014
Su Mo Tu We Th Fr Sa
4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
如何获得此输出?
March 2014
Su Mo Tu We Th Fr Sa
4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
仅供参考:$month $year $day
正在使用当前日期。
我试图避免使用一定数量的空格,因为如果它是不同的一天,那么这些数字就不会与空格匹配。
编辑:Jonathan Leffler
谢谢!这非常接近我正在寻找的输出。您发布的示例输出正是我正在寻找的但是在尝试您的代码之后。它给了我这个。
March 2014
Su Mo Tu We Th Fr Sa
2 3 4 5 Q6 7 8
6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
我怎么能用Q删除该行?我假设这来自您提供的第二个s///
编辑:
搞清楚,谢谢你的帮助!
答案 0 :(得分:2)
这个脚本有效(我认为):
year=2014
month=3
day=6
cal $month $year | sed -n -e '
1,2p
3,${/'$day'/{
s/^\(.*\)\('$day'.*\)/\1Q\2/
:blanks
s/^\( *\)[^ Q]/\1 /g
t blanks
s/Q//p
:a
n
p
ba
}
}'
示例输出:
March 2014
Su Mo Tu We Th Fr Sa
6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
s///
命令在您要保留的日期之前放置一个Q(不是cal
的输出的一部分)。 :blanks
,s///
和t blanks
用空白字符串和另一个空格替换一串空格和非空白非Q,将所有空格替换掉Q之前的非空白字符。s/Q//p
删除标记并打印该行。答案 1 :(得分:0)
awk
脚本以达到预期的效果:
<强> cal.awk 强>:
# Print first two lines (heading)
NR < 3 { print; next }
# Skip weeks in which the last day is before variable 'day'
$NF < day { next }
# Print full weeks if the first day is on or after variable 'day'
$1 >= day { print; next }
# This will be executed for the week on which variable 'day' falls.
{
# Traverse each day
for (i=1; i<=NF; ++i) {
# If current day is on or after variable 'day', print it.
if ($i >= day) {
if ($i < 10) # Check for extra formatting for single digit days
printf(" ");
printf("%d ", $i);
}
else
printf " "; # Formatting for blank days
}
print ""; # Add new line
}
调用:
cal $month $year | awk -v day=$day -f cal.awk