我有一個這樣的檔案(file.txt):
Yes
Yes
No
No
我想將此檔案輸出到 bash 終端,其中“是”為綠色,“否”為紅色。我撰寫了以下腳本:
RED='\033[0;31m'
NC='\033[0m'
GREEN='\033[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='\033[0;31m'
printf "${RED}No${NC}"
我如何讀取檔案,為其內容著色,然后列印到終端?
uj5u.com熱心網友回復:
我如何讀取檔案,為其內容著色,然后列印到終端?
您可以將擴展保留在檔案中,并${...}在讀取檔案時用變數替換表單:
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='\033[0;31m'
NC='\033[0m'
GREEN='\033[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='\033[0;31m' .... sed "....${RED}..."
sed不解釋八進制轉義序列。對于sed字串\033是一個零位元組 0x00 后跟兩個33.
printf "$(cat ...)"
是一種反模式。只需執行cat ....
cat ... | sed..
是沒用的貓用。
如何讓 printf 讀取檔案內容
無法讀取帶有printf. 它不是一個工具。
并因此執行其中的命令。
這感覺與您的問題無關,但要執行檔案只需使用解釋器呼叫它sh ./file.sh或在當前執行環境中獲取它. ./file.sh。
uj5u.com熱心網友回復:
我碰巧有一個方便的 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[$1]:-7}")" "$2" "$(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,或其他任何您想要的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323969.html
