将突出显示的字符替换为其他字符

将突出显示的字符替换为其他字符

我希望用其他东西替换颜色代码。例如,运行cal命令时我想获取一些 html 标签而不是颜色代码:

     July 2015        
Su Mo Tu We Th Fr Sa  
          1  2  3  4  
 5  <strong>6</strong>  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 

执行echo -e "\e[0;36m\e[41m some text"后,背景为红色,上面是蓝色。按照同样的例子,我可以找出这种颜色的十六进制代码:

echo -e "\e[0;36m\e[41m" | hexdump

也就是5b1b 3b30 3633 1b6d 345b 6d31 000a。如何编写sed命令将所有颜色代码替换为其他颜色代码?

答案1

假设:您正在通过管道尝试执行此操作。
注意:cal仅将颜色代码打印到tty

首先,如果您要替换cal通过管道发送的内容,那么您需要检查cal发送到该管道的内容。

$ cal | od -t x1z -w$((($COLUMNS-12)/4))
0000000 20 20 20 20 20 4a 75 6c 69 20 32 30 31 35 20 20 20 20 > 2015 年 7 月 <
0000022 20 20 20 20 0a 73 c3 b6 20 6d c3 a5 20 74 69 20 6f 6e > .s.. m.. ti on<
0000044 20 74 6f 20 66 72 20 6c c3 b6 20 20 0a 20 20 20 20 20 > 至 fr l.. . <
0000066 20 20 20 20 20 31 20 20 32 20 20 33 20 20 34 20 20 0a > 1 2 3 4 .<
0000110 20 35 20 5f 08 20 5f 08 36 20 20 37 20 20 38 20 20 39 > 5 _. _.6 7 8 9<
0000132 20 31 30 20 31 31 20 20 0a 31 32 20 31 33 20 31 34 20 > 10 11 .12 13 14 <
0000154 31 35 20 31 36 20 31 37 20 31 38 20 20 0a 31 39 20 32 >15 16 17 18 .19 2<
0000176 30 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 20 >0 21 22 23 24 25 <
0000220 0a 32 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33 31 >.26 27 28 29 30 31<
0000242 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 > . <
0000264 20 20 20 20 20 20 20 20 20 20 0a > .<
0000277

检查十六进制代码(从od -t x1上面你可以看到序列
35 20 5f 08 20 5f 08 36 20 20 37
,其中35(前两个字符)与实际输出中的相同5,最后一个字符与实际输出中37的相同7(以及右侧的 ascii 转储中的相同)。
就在37你看到几个20(空格)之前,有一个36来自6
现在,在 的左边36你可以看到需要替换的内容:5f 08 20 5f 08

$ cal | sed -re 's/\x5f\x08\x20\x5f\x086/<strong>6<\/strong>/'
     2015 年 7 月        
所以 må ti on to fr lö  
          1 2 3 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  

好了。
我将把这个任务留给你。


另外一个提示是,检查man 5 terminfo要尝试的事情tput- 这将尽可能地适应运行时手头的终端类型。

因此,tput setb 6如果终端支持,将设置背景颜色 6。同样,tput sgr0将所有颜色设置重置为“正常”。

如果你将 tput 输出导入到例如,od -t x1z你将看到输出是什么。

最终结果:比使用以下脚本更具可移植性的脚本echo -e ...

相关内容