查找并替换当前文本以用颜色包裹

Find And Replace Current Text to Wrap In Color

所以我正在尝试为 cal 创建一个别名,它将 运行 通过 sed 将当前日期包装在红色的终端转义符中。

cal | sed "s/($(date +%d))/\033\[94m$(date +%d)\033\[0m/g"

但是,我显然不能在捕获组内使用像 $(date +%d) 这样的内联命令执行。

此外,如果我在两个地方都使用命令替换,我可以让替换工作,但不能使用反斜杠来转义颜色代码。

$ cal | sed "s/$(date +%d)/\033\[94m$(date +%d)\033\[0m/g"
      May 2016
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 033[94m11033[0m 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

有没有办法用颜色包装替代品?此外,是否有更好的正则表达式来处理个位数天数? (因为在每月的第一天到第九天,它会在日历上突出显示该数字的每个实例。)

编辑:我是 运行ning OS X,达尔文内核版本 15.2.0,因为显然 OS X 上的 cal 实现不支持 -h 选项。

尝试:

cal -h | sed "s/$(date +%d)/"$'3\[94m&3\[0m/g'

备注:

  1. 默认情况下,cal 突出显示当天。我使用 -h 选项将其关闭,这样它就不会干扰您喜欢的颜色。 [更新:显然这仅适用于 GNU cal]

  2. 你是对的 $(date +%d) 必须出现在双引号中。但是,命令的其余部分没有。在上面,我使用 bash 的 $'...' 作为命令的其余部分,因为它支持转义序列。

  3. 不需要一秒钟$(date +%d)。我们可以用 &.

  4. 调用匹配的文本
  5. 如果你有 GNU sed,解决个位数日期问题的一种简便方法是使用 \<...\>:

    要求匹配的文本是一个完整的单词
    cal -h | sed "s/\<$(date +%d)\>/"$'3\[94m&3\[0m/g'  # GNU
    

    如果您的 sed 没有该功能,您将需要 s 命令:

    cal -h | sed "s/ $(date +%d) /"$'3\[94m&3\[0m/g; '"s/ $(date +%d)$/"$'3\[94m&3\[0m/g'
    

    第一个替换命令查找被 space 包围的日期。这适用于除行尾的日期之外的所有个位数日期。第二个查找以 space 开头且后跟行尾 ($).

  6. 的日期