我正在处理输入(来自诸如但限于 ls -la --color 之类的来源)并在文本的某些部分下划线。我不会逐个字符地处理这些输入,而是使用大量正则表达式,这使得跟踪我正在影响的子字符串是否已经着色或粗体变得相当困难。如果我有一个红色的文本块,并且我想在其中的某些部分下划线,我可能会这样做:
s/(123)/\033[4m\1\033[0m/g
(我的表达式要复杂得多。实际上,匹配被提取、自行处理,并进一步分解和分析。这不是通过更改我在这里给出的表达式可以完成的事情。)
上面的代码会将所有出现的 123 替换为 [UNDERLINE_START]123[FORMAT_RESET]。不幸的是,重置也会关闭文本的着色。当我只想禁用下划线时,如果我可以关闭下划线,这将为我省去很多麻烦,但我很确定没有办法做到这一点。谁能告诉我我错了?
编辑:我可以通过询问来简化问题:如果我想关闭下划线,我可以在不影响当前文本颜色的情况下做到这一点,因为该颜色可能在我的脚本开始执行之前很久就已经设置了,而且我不这样做有办法检测那个颜色是什么吗?
似乎没有人记录它,但在装饰器代码中添加 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
不要使用那些硬编码的转义序列,而是使用:
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} 仅关闭下划线。