如何使用 ANSI 颜色代码将彩色文本从文件打印到 bash 终端?
How to use ANSI color codes to print colored text to bash terminal from a file?
我有一个这样的文件 (file.txt):
Yes
Yes
No
No
我想将此文件输出到 bash 终端,“是”为绿色,“否”为红色。我写了以下脚本:
RED='3[0;31m'
NC='3[0m'
GREEN='3[0;32m'
cat file.txt | sed 's/No/${RED}No${NC}/g' | sed 's/Yes/${GREEN}Yes${NC}/g' > color_file.txt
printf "$(cat color_file.txt)"
输出如下所示:
${GREEN}Yes${NC}
${GREEN}Yes${NC}
${RED}No${NC}
${RED}No${NC}
而不是着色。
如果我有这样的脚本,着色就可以了:
RED='3[0;31m'
printf "${RED}No${NC}"
我如何读取文件、为其内容着色然后打印到终端?
How would I read a file, color its contents and then print to the terminal?
您可以将扩展保留在文件中,并在读取文件时用变量替换 ${...}
形式:
RED=$'\E[0;31m'
NC=$'\E[0m'
GREEN=$'\E[0;32m'
sed 's/No/${RED}No${NC}/g ; s/Yes/${GREEN}Yes${NC}/g' file.txt > color_file.txt
( export RED NC GREEN ; envsubst color_file.txt )
但我相信您想实际将转义序列输出到文件中:
RED=$'\E[0;31m'
NC=$'\E[0m'
GREEN=$'\E[0;32m'
sed "s/No/${RED}No${NC}/g ; s/Yes/${GREEN}Yes${NC}/g" file.txt > color_file.txt
cat color_file.txt
或者您可能希望 printf
解释文件内容中的 escpe 序列:
RED='3[0;31m'
NC='3[0m'
GREEN='3[0;32m'
sed "s/No/${RED}No${NC}/g ; s/Yes/${GREEN}Yes${NC}/g" file.txt > color_file.txt
printf "%b\n" "$(cat color_file.txt)"
# or maybe:
xargs -0 printf "%b" < color_file.txt
# or maybe:
sed 's/\033/\e/g' color_file.txt
# etc.
使用 shellcheck 检查您的脚本 - 它会告诉您您所犯的所有错误。
's/No/${RED}...'
单引号内不展开变量。
#If you would:
RED='3[0;31m'
.... sed "....${RED}..."
sed
不解释八进制转义序列。对于 sed
,字符串 3
是一个零字节 0x00,后跟两个 33
.
printf "$(cat ...)"
是反模式。只需执行 cat ...
.
cat ... | sed..
cat是无用的用法
how to make printf read the content of the file
无法使用 printf
读取文件。它不是一个工具。
and therefore execute the commands within it.
这感觉与您的问题无关,但要执行一个文件,只需使用解释器 sh ./file.sh
调用它或在当前执行环境 . ./file.sh
.
中获取它
我碰巧有一个方便的 bash 函数来为文本着色,而不必记住神秘的 ANSI 转义符或什么值映射到什么数字。使用它:
#!/usr/bin/env bash
# Map color names to terminfo setaf/setab codes.
declare -A colors=( [black]=0 [red]=1 [green]=2 [yellow]=3 [blue]=4
[magenta]=5 [cyan]=6 [white]=7 )
# colorize colorname text
# Returns text wrapped in ANSI color tags. Unknown color names are mapped to white.
colorize() {
printf "%s%s%s" "$(tput setaf "${colors[]:-7}")" "" "$(tput op)"
}
greenyes=$(colorize green Yes)
redno=$(colorize red No)
sed -e "s/Yes/$greenyes/g" -e "s/No/$redno/g" file.txt
会将彩色 file.txt
打印到标准输出。您可以重定向到不同的文件,或者通过将其传送到 tee
或您想要的任何其他内容来同时执行这两个操作。
我有一个这样的文件 (file.txt):
Yes
Yes
No
No
我想将此文件输出到 bash 终端,“是”为绿色,“否”为红色。我写了以下脚本:
RED='3[0;31m'
NC='3[0m'
GREEN='3[0;32m'
cat file.txt | sed 's/No/${RED}No${NC}/g' | sed 's/Yes/${GREEN}Yes${NC}/g' > color_file.txt
printf "$(cat color_file.txt)"
输出如下所示:
${GREEN}Yes${NC}
${GREEN}Yes${NC}
${RED}No${NC}
${RED}No${NC}
而不是着色。
如果我有这样的脚本,着色就可以了:
RED='3[0;31m'
printf "${RED}No${NC}"
我如何读取文件、为其内容着色然后打印到终端?
How would I read a file, color its contents and then print to the terminal?
您可以将扩展保留在文件中,并在读取文件时用变量替换 ${...}
形式:
RED=$'\E[0;31m'
NC=$'\E[0m'
GREEN=$'\E[0;32m'
sed 's/No/${RED}No${NC}/g ; s/Yes/${GREEN}Yes${NC}/g' file.txt > color_file.txt
( export RED NC GREEN ; envsubst color_file.txt )
但我相信您想实际将转义序列输出到文件中:
RED=$'\E[0;31m'
NC=$'\E[0m'
GREEN=$'\E[0;32m'
sed "s/No/${RED}No${NC}/g ; s/Yes/${GREEN}Yes${NC}/g" file.txt > color_file.txt
cat color_file.txt
或者您可能希望 printf
解释文件内容中的 escpe 序列:
RED='3[0;31m'
NC='3[0m'
GREEN='3[0;32m'
sed "s/No/${RED}No${NC}/g ; s/Yes/${GREEN}Yes${NC}/g" file.txt > color_file.txt
printf "%b\n" "$(cat color_file.txt)"
# or maybe:
xargs -0 printf "%b" < color_file.txt
# or maybe:
sed 's/\033/\e/g' color_file.txt
# etc.
使用 shellcheck 检查您的脚本 - 它会告诉您您所犯的所有错误。
's/No/${RED}...'
单引号内不展开变量。
#If you would: RED='3[0;31m' .... sed "....${RED}..."
sed
不解释八进制转义序列。对于 sed
,字符串 3
是一个零字节 0x00,后跟两个 33
.
printf "$(cat ...)"
是反模式。只需执行 cat ...
.
cat ... | sed..
cat是无用的用法
how to make printf read the content of the file
无法使用 printf
读取文件。它不是一个工具。
and therefore execute the commands within it.
这感觉与您的问题无关,但要执行一个文件,只需使用解释器 sh ./file.sh
调用它或在当前执行环境 . ./file.sh
.
我碰巧有一个方便的 bash 函数来为文本着色,而不必记住神秘的 ANSI 转义符或什么值映射到什么数字。使用它:
#!/usr/bin/env bash
# Map color names to terminfo setaf/setab codes.
declare -A colors=( [black]=0 [red]=1 [green]=2 [yellow]=3 [blue]=4
[magenta]=5 [cyan]=6 [white]=7 )
# colorize colorname text
# Returns text wrapped in ANSI color tags. Unknown color names are mapped to white.
colorize() {
printf "%s%s%s" "$(tput setaf "${colors[]:-7}")" "" "$(tput op)"
}
greenyes=$(colorize green Yes)
redno=$(colorize red No)
sed -e "s/Yes/$greenyes/g" -e "s/No/$redno/g" file.txt
会将彩色 file.txt
打印到标准输出。您可以重定向到不同的文件,或者通过将其传送到 tee
或您想要的任何其他内容来同时执行这两个操作。