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

时间:2016-05-11 19:20:18

标签: bash sed colors zsh

所以我正在尝试为@if(!Request::ajax()) // all layout code @else @yield('content') @endif 创建一个别名,它将通过cal运行它以将当前日期包裹在终端转义中为红色。

sed

但是,我显然不能在捕获组内部使用cal | sed "s/($(date +%d))/\\033\[94m$(date +%d)\\033\[0m/g" 之类的内联命令执行。

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

$(date +%d)

有没有办法用颜色包装替换品?另外,有没有更好的正则表达式来处理单个数字天? (由于在该月的第一天到第九天,它将突出显示该日历上该数字的每个实例。)

编辑:我正在运行OS X,Darwin内核版本15.2.0,因为显然OS X上的cal实现不支持$ 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 选项。

1 个答案:

答案 0 :(得分:2)

尝试:

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

注意:

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

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

  3. 不需要第二个$(date +%d)。我们可以使用&调用匹配的文字。

  4. 如果你有GNU sed,修复单位数日期问题的一种便捷方法是使用\<...\>要求匹配的文字是一个完整的单词:

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

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

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

    第一个替换命令查找由空格包围的日期。这适用于除一行末尾的所有单个数字日期。第二个查找以空格开头的日期,然后是行的末尾($)。