如何从变量中生成回显处理颜色命令?

时间:2016-06-07 01:30:36

标签: bash colors echo

我正在编写一个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 ...

我做错了什么,或者我该怎么做?感谢。

4 个答案:

答案 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

<强>参考

  1. Bash:[ Using Colors ]
  2. Shell参数[ expansion ]
  3. 在某些符合POSIX标准的shell中,echo即默认为echo -e。对于bash,你可以忽略这一点。查看[ this ]了解详情。无论如何,我已将echo -e替换为printf '%b\n'
  4. 注意:此答案并不能完全满足您的要求,只是向您展示了另一种做事方式。

答案 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/中,regexstring部分的语法略有不同。)

答案 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/"

再次,谢谢大家!