“Дружественные” терминальные названия цвета в сценариях оболочки?

Я не понимаю, почему Ваш отрывок жемчуга записан этот путь. Вы могли записать regexp непосредственно в сценарии:

perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'

который позволяет Вам использовать в своих интересах -n опция (в качестве награды, Вы получаете надлежащее сообщение об ошибке в случае, если существует входная ошибка). Далее использование идиом жемчуга:

perl -ne 'print if /my regex/'

Sed имеет обратные ссылки, но расширенные regexes perl более мощны, существуют вещи, которые Вы не можете сделать с sed (sed, даже не имеет полного regexes: чередование \| не стандартная функция, хотя много реализаций имеют ее).

Большая часть того, что можно сделать с традиционными инструментами, можно сделать легко в жемчуге. Например, если Вы хотите пропустить первые K-1 байты, можно записать

perl -ne 'BEGIN {read ARGV, "", 42-1}; …'

Если Вы хотите мобильность, много задач обработки текста может быть сделано в awk, но awk не имеет обратных ссылок вообще, так извлечение текста от строки может быть неуклюжим.

25
27.09.2013, 01:26
5 ответов

Можно определить, раскрашивает сценарии удара как так:

red=$'\e[1;31m'
grn=$'\e[1;32m'
yel=$'\e[1;33m'
blu=$'\e[1;34m'
mag=$'\e[1;35m'
cyn=$'\e[1;36m'
end=$'\e[0m'

И затем используйте их для печати в необходимых цветах:

printf "%s\n" "Text in ${red}red${end}, white and ${blu}blue${end}."
39
27.01.2020, 19:40

Можно использовать tput ИЛИ printf

Используя tput ,

просто создайте функцию как ниже и используйте их

shw_grey () {
    echo $(tput bold)$(tput setaf 0) $@ $(tput sgr 0)
}

shw_norm () {
    echo $(tput bold)$(tput setaf 9) $@ $(tput sgr 0)
}

shw_info () {
    echo $(tput bold)$(tput setaf 4) $@ $(tput sgr 0)
}

shw_warn () {
    echo $(tput bold)$(tput setaf 2) $@ $(tput sgr 0)
}
shw_err ()  {
    echo $(tput bold)$(tput setaf 1) $@ $(tput sgr 0)
}

можно звонить выше функционального использования shw_err "WARNING:: Error bla bla"

Используя printf

print red; echo -e "\e[31mfoo\e[m"
11
27.01.2020, 19:40
  • 1
    echo -e не printf, и также нуждается в предупреждении, что это отличается от tput опция в этом это автоматически не адаптируется к иску $TERM. –  Toby Speight 20.10.2017, 13:48

В zsh:

autoload -U colors
colors

echo $fg[green]YES$fg[default] or $fg[red]NO$fg[default]?
7
27.01.2020, 19:40

Для простого обычного использования (полная строка текста только одного цвета с завершающей новой строкой) я изменил код jasonwryan следующим образом:

#!/bin/bash

red='\e[1;31m%s\e[0m\n'
green='\e[1;32m%s\e[0m\n'
yellow='\e[1;33m%s\e[0m\n'
blue='\e[1;34m%s\e[0m\n'
magenta='\e[1;35m%s\e[0m\n'
cyan='\e[1;36m%s\e[0m\n'

printf "$green"   "This is a test in green"
printf "$red"     "This is a test in red"
printf "$yellow"  "This is a test in yellow"
printf "$blue"    "This is a test in blue"
printf "$magenta" "This is a test in magenta"
printf "$cyan"    "This is a test in cyan"
4
27.01.2020, 19:40

Лучше использовать tput, который будет обрабатывать escape-символы в зависимости от возможностей вывода/терминала. (Если терминал не может интерпретировать \e[*цветовые коды, он будет «загрязнен», что затруднит чтение вывода. (Или иногда, если вы grepтакой вывод, вы увидите эти \e[*в результатах)

См. этот учебник для tput,

Вы можете написать:

blue=$( tput setaf 4 ) ;
normal=$( tput sgr0 ) ;
echo "hello ${blue}blue world${normal}" ;

Вот учебник, чтобы напечатать цветные часы в терминале

Также обратите внимание, что tputможет по-прежнему печатать escape-символ при перенаправлении STDOUT в файл:

$ myColoredScript.sh > output.log ;
# Problem: output.log will contain things like "^[(B^[[m"

Чтобы этого не произошло, настройте свой tputпеременные, подобные предложенным в этом решении.

4
27.01.2020, 19:40

Теги

Похожие вопросы