【问题标题】:Kornshell - How to print blank spaces properly sed and calKornshell - 如何正确打印空格 sed 和 cal
【发布时间】:2014-06-04 23:27:10
【问题描述】:

我目前正在使用这个命令,

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 正在使用当前日期。 我试图避免使用一定数量的空格,因为如果是不同的日子,那么这些数字将与空格不匹配。

编辑:乔纳森·莱弗勒

谢谢!这非常接近我正在寻找的输出。您发布的示例输出正是我正在寻找的,但在尝试了您的代码之后。它给了我这个。

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///

编辑:

想办法,谢谢你的帮助!

【问题讨论】:

  • 我想您在尝试运行此片段时已经设置了day=4month=3year=2014。最好创建一个 SSCCE (Short, Self-Contained, Correct Example),在这种情况下,这意味着显式设置三个变量。你的sed 命令太多了;您应该可以一次性完成所有操作。

标签: unix sed ksh cal


【解决方案1】:

这个脚本有效(我认为):

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 的输出的一部分)。
  • 标签:blankss///t blanks 将一串空白和一个非空白、非Q 替换为一串空白和另一个空白,将所有非空白字符转换为问。
  • s/Q//p 删除标记并打印行。
  • 其余代码与之前相同(但分布在多行中);它获取下一行输入并重复打印。

【讨论】:

    【解决方案2】:

    一个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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2016-09-05
      • 2020-09-17
      • 2020-03-05
      • 1970-01-01
      • 2013-10-07
      • 2011-07-23
      相关资源
      最近更新 更多