我正在编写一个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/ >/\r\n >/' > 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 ...
我做错了什么,或者我该怎么做?感谢。
答案 0 :(得分:2)
您可能不希望将控制字符引入纯文本文件。见[ exploits of a mom ]。
如果没有 sed ,下面可能是一种解决问题的方法。
#Adding color to bash script output
while read -r line # -r to prevent mangling of literal backslashes
do
printf '%b\n' "${line/#>/\\e[1;34m>}" #using shell parameter expansion See Ref 2
#Also, you need two `\` make one `\` in the substitution
printf '%b\n' "\e[0;m" #resetting color to defaults, this is important
done<your_actual_file
<强>参考强>
echo
即默认为echo -e
。对于bash,你可以忽略这一点。查看[ this ]了解详情。无论如何,我已将echo -e
替换为printf '%b\n'
。注意:此答案并不能完全满足您的要求,只是向您展示了另一种做事方式。
答案 1 :(得分:2)
您在文件中有正确的转义序列,但这些转义序列未在您的while循环中读取。尝试在读取时添加原始输入标志(-r),这将不解释转义序列并为您提供所需的格式。
while read -r line
do
echo -e "${line}"
done < bwtext.txt
答案 2 :(得分:0)
如果看到033
,则需要使用文字转义字符。您的sed
和/或echo -e
可能会这样做,但在这方面它们没有标准化,如果没有关于您系统的详细信息,我们无法准确地告诉您如何修复脚本。但是你可以转向一个合理标准化的工具,比如Perl;
perl -pe 's/ >/\r\n >/;
s/>/>\033[0;34m/g;
s/\$/\$\033[0;33m/g;
s/http/\033[0;37mhttp/g' newlist.txt
顺便说一下,sed
支持在脚本中放置多个命令,就像Perl一样。即使您不能这样做,将命令放在管道中也比使用sed -i
重复重写同一文件更有效。
(另外,[
只是替换字符串中的普通字符,不需要反斜杠。在匹配部分,参数是正则表达式,当然[
有换句话说,在s/regex/string/
中,regex
和string
部分的语法略有不同。)
答案 3 :(得分:0)
我要感谢你们所有人的帮助。我将保持-r开关读取和printf而不是echo建议,以备将来参考。我还把它发布到Ubuntu论坛,在那里我提供了另一个运行良好的选项:
tac newlist.txt | sed 's/ >/\r\n >/' > reversed.txt
sed $"s/\(>[^$]*\)\($.*\)/$DESC\1$COST\2/" reversed.txt | sed $"s/\(http.*\)/$LINK\1$CLR/" | sed $"s/\(FREE\)/$FREE\1$CLR/"
再次,谢谢大家!