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

Sni*_*gus 5 bash formatting fonts xterm underline

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

s/(123)/\033[4m\1\033[0m/g
Run Code Online (Sandbox Code Playgroud)

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

上面的代码将用[UNDERLINE_START] 123 [FORMAT_RESET]替换所有出现的123。不幸的是,重置还关闭了文本的颜色。如果仅在要禁用的所有功能时都关闭下划线,那将为我省去很多麻烦,但我敢肯定,没有办法做到这一点。谁能告诉我我错了吗?

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

Sni*_*gus 9

似乎没有人记录它,但是在装饰器代码中添加 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
Run Code Online (Sandbox Code Playgroud)

  • `2` 用于暗色,而不是禁用粗体。`22` 用于禁用暗淡 ** 和 ** 粗体。使用“21”禁用粗体并未得到广泛支持(例如在 macOS 上不支持)。 (4认同)