查找并替换当前文本以换行颜色

Bra*_*ldi 4 bash zsh sed colors

所以我试图创建一个别名,cal它将运行它sed以将当天的终端转义为红色。

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

但是,我显然无法像$(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
Run Code Online (Sandbox Code Playgroud)

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

编辑:我正在运行 OS X,Darwin Kernel Version 15.2.0,因为显然 OS X 上的 cal 实现不支持该-h选项。

Joh*_*024 5

尝试:

cal -h | sed "s/$(date +%d)/"$'\033\[94m&\033\[0m/g'
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  2. 你是对的,$(date +%d)必须出现在双引号中。然而,该命令的其余部分则不然。上面,我使用 bash$'...'来执行命令的其余部分,因为它支持转义序列。

  3. 不需要一秒钟$(date +%d)。我们可以用 来回忆匹配的文本&

  4. 如果您有 GNU sed,解决个位数日期问题的一个便捷方法是要求匹配的文本是一个完整的单词,使用\<...\>

    cal -h | sed "s/\<$(date +%d)\>/"$'\033\[94m&\033\[0m/g'  # GNU
    
    Run Code Online (Sandbox Code Playgroud)

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

    cal -h | sed "s/ $(date +%d) /"$'\033\[94m&\033\[0m/g; '"s/ $(date +%d)$/"$'\033\[94m&\033\[0m/g'
    
    Run Code Online (Sandbox Code Playgroud)

    第一个替换命令查找由空格包围的日期。这适用于除行尾日期之外的所有单位日期。第二个查找前面有空格、后面是行尾 ( $) 的日期。