У меня большой файл, и мне нужно просмотреть определенные шаблоны. а также искать другие шаблоны, основанные на первом шаблоне, и, таким образом, для этого требуется раскрасить строки, соответствующие поиску в том же файле.
Основным требованием здесь является то, что мне нужно сохранить эти цвета в моем исходном текстовом файле, а не только на терминале
, например,
line
lactose
galactose
glusocse
lactose
lactos
, и мне нужно искать лактозу, а также окрашивать лактозу (например, желтую)
Я записал сценарий для этого:
#!/usr/bin/env perl
use Getopt::Std;
use strict;
use Term::ANSIColor;
my %opts;
getopts('himc:l:',\%opts);
if ($opts{h}) {
print<<EoF;
DESCRIPTION
$0 will highlight the given pattern in color.
USAGE
$0 [OPTIONS] -l PATTERN FILE
If FILE is omitted, it reads from STDIN.
-c : comma separated list of colors
-h : print this help and exit
-l : comma separated list of search patterns (can be regular expressions)
-m : only print matching lines (grep-like)
-s : makes the search case sensitive
EoF
exit(0);
}
my $case_sensitive=$opts{s}||undef;
my $only_matching=$opts{m}||undef;
my @color=('bold red','bold blue', 'bold yellow', 'bold green',
'bold magenta', 'bold cyan', 'yellow on_magenta',
'bright_white on_red', 'bright_yellow on_red', 'white on_black');
## user provided color
if ($opts{c}) {
@color=split(/,/,$opts{c});
}
## read patterns
my @patterns;
if ($opts{l}) {
@patterns=split(/,/,$opts{l});
} else {
die("Need a pattern to search for (-l)\n");
}
# Setting $| to non-zero forces a flush right away and after
# every write or print on the currently selected output channel.
$|=1;
while (<>) {
my $matched;
for (my $c=0; $c<=$#patterns; $c++) {
if ($case_sensitive) {
if (/$patterns[$c]/) {
s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge && $matched++;
}
} else {
if (/$patterns[$c]/i) {
s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige && $matched++;
}
}
}
## Skip non-matching lines
if ($only_matching) {
next unless $matched;
}
print STDOUT;
}
Сохраните файл как ~/bin/color
, сделайте это исполняемым файлом (chmod 755 ~/bin/color
) и затем выполненный это, давая ему разделенный запятыми список шаблонов для окраски:
Так, для окраски строк входного файла Вы могли просто использовать сценарий выше, перенаправить вывод в новый файл и затем переименовать оригинал:
Введите следующую команду:
sudo nano /etc/bash.bashrc
PgDn Хита, пока Вы не в конце.
вставка Копии следующий текст:
alias grep-grey="GREP_COLOR='1;30' grep --color=always"
alias grep-red="GREP_COLOR='1;31' grep --color=always"
alias grep-green="GREP_COLOR='1;32' grep --color=always"
alias grep-yellow="GREP_COLOR='1;33' grep --color=always"
alias grep-blue="GREP_COLOR='1;34' grep --color=always"
alias grep-magenta="GREP_COLOR='1;35' grep --color=always"
alias grep-cyan="GREP_COLOR='1;36' grep --color=always"
alias grep-white="GREP_COLOR='1;37' grep --color=always"
Нажатие Ctrl + X тогда Y тогда Вводит Выход
, все терминалы
Вводят новый терминал и тип:
grep-yellow lactose /path/to/file