如何从变量制作回显印刷色命令

  • 本文关键字:命令 变量 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/ >/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

引用

  1. Bash: [ 使用颜色 ]。
  2. 外壳参数 [ 展开 ]。
  3. 在一些符合POSIX标准的shell中,echo默认为echo -e。你可以忽略这一点来抨击。查看 [ 此 ] 了解更多信息。无论如何,我已经用printf '%bn'替换了echo -e.

注意:此答案并不能完全满足您的要求,而只是向您展示另一种做事方式。

在你看到033的地方,你需要有一个文字转义字符。 您的sed和/或echo -e可能可以做到这一点,但它们在这方面没有标准化,并且没有关于您的系统的详细信息,我们无法确切地告诉您如何修复脚本。但是你可以转向一个相当标准化的工具,比如Perl;

perl -pe 's/ >/rn   >/;
    s/>/>33[0;34m/g;
    s/$/$33[0;33m/g;
    s/http/33[0;37mhttp/g' newlist.txt

顺便说一下,sed支持在一个脚本中放置多个命令,就像Perl一样。 即使你不能做到这一点,将命令放在管道中也比用sed -i重复重写同一个文件要高效得多。

(另外,[只是替换字符串中的普通字符,不需要反斜杠。 在匹配部分,参数是一个正则表达式,其中[当然具有特殊含义。 换句话说,s/regex/string/ regexstring部分的语法略有不同。

我要

感谢你们所有人的帮助。我将同时保留 -r 开关的读取和 printf 而不是 echo 建议,以备将来参考。我还将其发布到Ubuntu论坛上,在那里我获得了另一个运行良好的选项:

tac newlist.txt | sed 's/ >/rn   >/' > reversed.txt
sed $"s/(>[^$]*)($.*)/$DESC1$COST2/" reversed.txt | sed $"s/(http.*)/$LINK1$CLR/" | sed $"s/(FREE)/$FREE1$CLR/"

再次感谢大家!

相关内容

  • 没有找到相关文章