7

我正在处理输入(来自但仅限于 ls -la --color 等来源)并在文本的某些部分下划线。我不会逐个字符地处理这些输入,而是使用大量正则表达式,这使得跟踪我正在影响的子字符串是已经着色还是粗体变得相当困难。如果我有一个红色的文本块,并且我想在其中的某些部分下划线,我可能会执行以下操作:

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

(我的表达式要复杂得多。实际上,匹配项是自己提取、处理的,然后进一步分解和分析。这不是通过更改我在这里给出的表达式可以完成的事情。)

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

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

4

2 回答 2

12

似乎没有人记录它,但是在装饰器代码中添加 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
于 2013-03-22T23:34:33.590 回答
3

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

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} 只关闭下划线。

于 2019-08-20T10:21:06.040 回答