评估命令的颜色格式输出
Evaluate Color Formatted Output of Command
我正在使用 diff 来格式化包含 tput 颜色变量的字符串,并且在不使用“evil”eval
的情况下无法评估这些变量
命令。
创建字符串的命令:
output1="$(diff --changed-group-format="${RED}%=${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n')"
并输出:
[String n${RED}â${CLS}m${RED}è™${CLS}]
我查看并搜索了其他答案,但除了以下内容外没有任何效果:
eval echo "${output1}"
据我所知,我的 3 个选择是 eval
(不好),间接扩展(更好),和数组(最佳)。每次间接尝试都失败了。我很想使用 array 选项,但我只是看不到它在这里如何应用。我错过了什么吗?
我认为这不相关,但是发送到 diff 的变量和字符串构造在另一个问题中 。
您可以使用 Bash 参数扩展,如果您愿意使用一组有限的、预先已知的颜色代码:
#!/usr/bin/env bash
# Define the variables containing ANSI color sequences.
RED="$(tput setaf 1)"
CYA="$(tput setaf 6)"
CLS="$(tput sgr0)"
# Sample input string
str='[String n${RED}â${CLS}m${CYA}è™${CLS}]'
# Replace the placeholders with their corresponding variable values.
str=${str//'${RED}'/${RED}}
str=${str//'${CYA}'/${CYA}}
str=${str//'${CLS}'/${CLS}}
# Output the result.
echo "$str"
这种方法利用了这样一个事实,即 Bash 参数扩展中使用的参数本身会受到扩展,除非单引号:
${<varName>//<search>/<replace>}
在变量 <varName>
. 的值中将 <search>
的所有实例替换为 <replace>
例如,'${RED}'
- 由于被 单引号 - 被视为 文字 搜索词。
${RED}
,例如 - 由于被 未引用 - 在被用作替换词之前被 扩展 ,因此用 变量的值 ${RED}
. 有效地替换 literal ${RED}
包装在函数中:
printColored() {
local str=
local RED="$(tput setaf 1)" CYA="$(tput setaf 6)" CLS="$(tput sgr0)"
str=${str//'${RED}'/${RED}}
str=${str//'${CYA}'/${CYA}}
str=${str//'${CLS}'/${CLS}}
printf '%s\n' "$str"
}
printColored '[String n${RED}â${CLS}m${CYA}è™${CLS}]'
顺便说一句,我将 ${CLS}
重命名为 ${RST}
(对于 "reset")或类似名称,因为术语 "cls" 表示清除整个屏幕。
我正在使用 diff 来格式化包含 tput 颜色变量的字符串,并且在不使用“evil”eval
的情况下无法评估这些变量
命令。
创建字符串的命令:
output1="$(diff --changed-group-format="${RED}%=${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n')"
并输出:
[String n${RED}â${CLS}m${RED}è™${CLS}]
我查看并搜索了其他答案,但除了以下内容外没有任何效果:
eval echo "${output1}"
据我所知,我的 3 个选择是 eval
(不好),间接扩展(更好),和数组(最佳)。每次间接尝试都失败了。我很想使用 array 选项,但我只是看不到它在这里如何应用。我错过了什么吗?
我认为这不相关,但是发送到 diff 的变量和字符串构造在另一个问题中
您可以使用 Bash 参数扩展,如果您愿意使用一组有限的、预先已知的颜色代码:
#!/usr/bin/env bash
# Define the variables containing ANSI color sequences.
RED="$(tput setaf 1)"
CYA="$(tput setaf 6)"
CLS="$(tput sgr0)"
# Sample input string
str='[String n${RED}â${CLS}m${CYA}è™${CLS}]'
# Replace the placeholders with their corresponding variable values.
str=${str//'${RED}'/${RED}}
str=${str//'${CYA}'/${CYA}}
str=${str//'${CLS}'/${CLS}}
# Output the result.
echo "$str"
这种方法利用了这样一个事实,即 Bash 参数扩展中使用的参数本身会受到扩展,除非单引号:
${<varName>//<search>/<replace>}
在变量<varName>
. 的值中将 '${RED}'
- 由于被 单引号 - 被视为 文字 搜索词。${RED}
,例如 - 由于被 未引用 - 在被用作替换词之前被 扩展 ,因此用 变量的值${RED}
. 有效地替换 literal
<search>
的所有实例替换为 <replace>
例如,${RED}
包装在函数中:
printColored() {
local str=
local RED="$(tput setaf 1)" CYA="$(tput setaf 6)" CLS="$(tput sgr0)"
str=${str//'${RED}'/${RED}}
str=${str//'${CYA}'/${CYA}}
str=${str//'${CLS}'/${CLS}}
printf '%s\n' "$str"
}
printColored '[String n${RED}â${CLS}m${CYA}è™${CLS}]'
顺便说一句,我将 ${CLS}
重命名为 ${RST}
(对于 "reset")或类似名称,因为术语 "cls" 表示清除整个屏幕。