Как раскрасить некоторые строки в файле

# teeshell

date=$(date +%Y-%m-%d_%H-%M-%S)
randstr=$(cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 4)
dir="$(echo ~/log/"${date}_${randstr}")"
mkdir "$dir"
# Redirect everything to tee and perl
exec 1> >(tee /dev/tty |
          perl -pe '                                                                          
            sub reopen {
              open(OUT,">'$dir'/".++$i);
              select OUT;
              $| = 1;
            }                     
            BEGIN {
              `echo $$ > "'$dir'"/pid`;
              reopen();                                       
              $SIG{HUP} = \&reopen;                                                           
            }') 2>&1

# wait for perl to save the pid
while [ ! -f "$dir"/pid ] ; do
    true
done

# Magic! Make perl save to a new file with a kill -HUP
PS1="[\$(kill -HUP `cat "$dir"/pid`)][\u@\h:\w]\$ "

Выполнить:

. teeshell
1
20.04.2016, 17:51
2 ответа

Как уже объяснялось в ZimbiX, используйте двойные кавычки и так далее.

Альтернативой его методу является использование синтаксиса $ '…' , в котором интерпретируются escape-последовательности. То есть:

\e    => ASCII ESC (0x1b, 033)
\033  => ASCII ESC (0x1b, 033)
\x1b  => ASCII ESC (0x1b, 033)

Итак:

red=$'\e[31m'
blue=$'\e[34m'

Затем:

printf $blue && sed "s/2/${red}2$blue/g" Hello.txt

Или, если хотите, включите переменную reset :

cc=$'\e[0m'
printf $blue && sed "s/2/$cc${red}2$cc$blue/g" Hello.txt && printf $cc

Чтобы просмотреть код, скажите что-нибудь вроде:

(printf $blue && sed "s/2/${red}2$blue/g" Hello.txt) | cat -v

Также обратите внимание на использование of g для глобального в sed .

1
27.01.2020, 23:25

Во-первых, двойные кавычки необходимы для интерполяции:

$ sed "s/2/${RED}2${BLUE}/" Hello.txt
1233[0;31m2233[0;34m53125213
233[0;31m2233[0;34m13532135
233[0;31m2233[0;34m3513125215

Однако управляющие последовательности ASCII содержат символы, которые влияют на sed, поэтому необходимо преобразовать управляющую последовательность символов в фактические управляющие символы. Это можно сделать с помощью вложенной оболочки. Обратите внимание на конечное /g, означающее, что в строке разрешено несколько замен.

$ sed "s/2/`echo $RED`2`echo $BLUE`/g" Hello.txt

coloured output 1

Теперь, это все еще не совсем правильно. На самом деле мы должны установить начало каждой строки синим цветом, а затем сделать так, чтобы каждая замена 2 начиналась красным цветом и заканчивалась синим. Символ шляпы, ^, является регулярным выражением, означающим начало строки. Также обратите внимание на трубы и перестановку, чтобы использовать cat.

$ cat Hello.txt | sed "s/^/`echo $BLUE`/" | sed "s/2/`echo $RED`2`echo $BLUE`/g"

coloured output 2

Вы также можете сделать это чище, переместив преобразование подшивки в присвоение переменной. Фигурные скобки необходимы для RED, чтобы отличить его от символа 2, чтобы он не пытался использовать несуществующую переменную RED2.

$ BLUE=`echo '\033[0;34m'`
$ RED=`echo '\033[0;31m'`
$ cat Hello.txt | sed "s/^/$BLUE/" | sed "s/2/${RED}2${BLUE}/g"

Источник: http://www.cyberciti.biz/faq/unix-linux-sed-ascii-control-codes-nonprintable/

2
27.01.2020, 23:25

Теги

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