我正在编写一个需要颜色输出的bash脚本。我有一个文本文件,在打印到屏幕上时需要像这样格式化:
>Barry's Whiskey Glass Drink Cup, XL 10 oz Dri... $0.75
example.org/product-page.php?id=1228741
>Cotton Bath Towel Pool Towel Brown - Easy Car... $6.11
example.org/product-page.php?id=1228763
>Cotton Bath Towel Pool Towel Red - Easy Care ... $6.11
example.org/product-page.php?id=1228766
>Mosiso MacBook Case for iPad Pro 12.9/MacBook... $1.95
example.org/product-page.php?id=1228850
">....."文本需要是一种颜色,"$..."另一种颜色,"example.org...."浅灰色。我试过这个:
tac newlist.txt | sed 's/ >/rn >/' > bwtext.txt
sed -i 's/>/>\033[0;34m/g' bwtext.txt
sed -i 's/$/$\033[0;33m/g' bwtext.txt
sed -i 's/http/\033[0;37mhttp/g' bwtext.txt
while read line
do
echo -e "${line}"
done < bwtext.txt
这会将正确的转义代码插入到文件中,但是当逐行回显时,它不会处理代码,而是按字面意思打印它们。
>033[0;34mFor Fitbit Alta Accessory Band, Silicone Repl... $033[0;33m1.97
033[0;37mexample.org/product-page.php?id=1247364
>033[0;34mTattify Gradient Nail Wraps - Love Like a Sun... $033[0;33m0.99
033[0;37mexample.org/product-page.php?id=1247367
>033[0;34mEA AromaCare Eucalyptus Essential Oil 120ml/4... $033[0;33m3.00
033[0;37mexample.org/product-page.php?id=1247370
... waiting 10 minutes for next update ...
我做错了什么,或者我怎样才能做对?谢谢。
文件中有正确的转义序列,但这些序列未在 while 循环中读取。尝试在读取时添加原始输入标志 ( -r ),这不会解释转义序列并为您提供所需的格式。
while read -r line
do
echo -e "${line}"
done < bwtext.txt
您可能不希望将控制字符引入纯文本文件。见[妈妈的功绩]。
下面可能是在没有 sed 的情况下解决您的问题的一种方法。
#Adding color to bash script output
while read -r line # -r to prevent mangling of literal backslashes
do
printf '%bn' "${line/#>/\e[1;34m>}" #using shell parameter expansion See Ref 2
#Also, you need two `` make one `` in the substitution
printf '%bn' "e[0;m" #resetting color to defaults, this is important
done<your_actual_file
引用
- Bash: [ 使用颜色 ]。
- 外壳参数 [ 展开 ]。
- 在一些符合POSIX标准的shell中,
echo
默认为echo -e
。你可以忽略这一点来抨击。查看 [ 此 ] 了解更多信息。无论如何,我已经用printf '%bn'
替换了echo -e
.
注意:此答案并不能完全满足您的要求,而只是向您展示另一种做事方式。
在你看到033
的地方,你需要有一个文字转义字符。 您的sed
和/或echo -e
可能可以做到这一点,但它们在这方面没有标准化,并且没有关于您的系统的详细信息,我们无法确切地告诉您如何修复脚本。但是你可以转向一个相当标准化的工具,比如Perl;
perl -pe 's/ >/rn >/;
s/>/>