在xterm中,我可以在不重置当前颜色的情况下关闭粗体或下划线吗?

时间:2013-03-22 20:58:34

标签: bash fonts formatting xterm underline

我正在处理输入(来自(例如,但限于,ls -la --color),并强调文本的某些部分。我不是逐个字符地处理这些输入,而是使用许多正则表达式,这使得很难跟踪我正在影响的子字符串是已经着色还是以粗体显示。如果我有一个红色的文本块,并且我想强调它的某些部分,我可能会做类似的事情:

s/(123)/\033[4m\1\033[0m/g

(我的表达要复杂得多。实际上,匹配提取,自行处理,进一步分解和分析。这不是可以通过改变我在这里给出的表达式来完成的。)< / p>

上面的代码会用[UNDERLINE_START] 123 [FORMAT_RESET]替换123的所有出现次数。不幸的是,重置也会关闭文本的颜色。如果我可以在我想要禁用的时候关闭下划线,那将会给我带来很大的麻烦,但我很确定没有办法做到这一点。谁能告诉我,我错了?

编辑:我可以通过询问来简化问题:如果我想关闭下划线,我可以在不影响当前文本颜色的情况下这样做,因为在我的脚本开始执行之前很久就设置了这种颜色,并且我不会有没有办法检测那种颜色是什么?

2 个答案:

答案 0 :(得分:3)

似乎没有人记录它,但在装饰器代码中添加20将关闭它们:

  echo -e "\\033[34;4m" underlined "\\033[24m" not underlined
  echo -e "\\033[34;1m" bold "\\033[2m" not bold
  echo -e "\\033[34;2m" dark "\\033[22m" not dark
  echo -e "\\033[34;7m" inverse "\\033[27m" not inverse

答案 1 :(得分:1)

而不是那些硬编码的转义序列,请使用:

tput smul # set underline
tput rmul # remove underline

tput smso # set bold on
tput rmso # remove bold

tput setaf 1 #red
tput setaf 2 #green

...
tput cup 0 0 # move to pos 0,0

有关这些命令的完整说明,请参阅“ man terminfo”和“ man tput”。

示例:

function f_help
{
c_green=$(tput  setaf 2      2>/dev/null)
c_reset=$(tput  sgr0         2>/dev/null)
c_bold=$(tput smso           2>/dev/null)
echo "${c_bold}DESCRIPTION${c_reset} : ...."
}


echo "${c_green}GREEN ${c_underline} GREEN AND UNDERLINED${c_nounderline} GREEN AGAIN${c_reset} PLAIN BLACK TEXT"

$ {c_underline}转义序列不影响文本的颜色;它只会加下划线。 $ {c_nounderline}仅关闭下划线。