Эхо от переменной в определенной части строки

#!/bin/bash
arp-scan -l

Страница руководства для arp -сканирование (1). (Если ваш компьютер имеет несколько интерфейсов,вам может потребоваться указать, сеть какого интерфейса вы хотите сканировать с помощью -I .)

2
22.09.2019, 04:45
3 ответа

Вы пытаетесь поместить сценарий оболочки в параметр форматирования Git. Конечно, это не сработает. 1

  • Есть некоторые параметры Git, которые на самом деле принимают сценарии оболочки, напримерgit filter-branch; но они будут явно указаны как таковые на соответствующей странице руководства.

То, что вы пытаетесь выполнить, на самом деле может быть выполнено не с помощью Git, а с помощью внешнего фильтра для сопоставления имен и пометки их цветами с помощью escape-последовательностей ANSI .

Например, если имя автора совпадает с «Joe Average », выделите имя и угловые скобки голубым цветом; в противном случае выделите имя и угловые скобки жирным синим цветом. 2 Остальные части текста оставьте без изменений в обоих случаях...

Реализовано с использованием Perl 5 в качестве фильтра:

git log "--pretty=tformat:%h <%an> %s" | perl -n -e '
chomp;
if(/^(.*)<([^>]*)>(.*)$/) {
    if ($2 eq "Joe Average") {
        print $1."\e[36m<".$2.">\e[39m".$3."\n";
    } else {
        print $1."\e[1m\e[34m<".$2.">\e[39m\e[0m$3\n";
    }
} else {
    print $_."\n";
}'

Реализовано с использованием sedв качестве фильтра (немного хакерски 3)...

git log "--pretty=tformat:%h <%an> %s" | sed '
s/<\(Joe Average\)>/\x1B[36m<\1>\x1B[39m/g;
t matched;
s/<\([^>]*\)>/\x1B[1m\x1B[34m<\1>\x1B[39m\x1B[0m/g;
:matched'

Обычный вывод (без фильтра )из тестового репозитория:

$ git log "--pretty=tformat:%h <%an> %s"
e7f3209 <Joe Average> improving portability
e3ebe74 <Jim Sixpack> adding first working prototype

Выделенный результат (пропущен через любой из фильтров):

Обратите внимание, что эти команды фильтрации по-прежнему будут работать, даже если вы изменили формат вывода git log, при условии, что:

  • Имя автора всегда заключено в <>.
  • В одной строке может быть не более одного автора.
  • В<>больше ничего не заключено.

Другой способ сделать то, о чем вы просили, — выполнить два разных вызова git logс разными --authorи --pretty, объединить результаты и отсортировать их по отметке времени; но сложная часть заключается в том, чтобы убедиться, что выходные данные обоих вызовов git logне дают перекрывающихся выходных данных. (Вы не можете использовать uniq, так как это помечает их обоих разными escape-последовательностями)


Сноски

  • 1 На самом деле, из-за отсутствия кавычек, вашif [ ! %an = "my own user name" ]...уже выполнялся бы в строке USER=(%anбудет сравниваться буквально — в шелле это не имеет особого значения )] ; сделать это эффективно USER="%C(cyan)<%an>"еще до того, как вы успели вызвать команду git log.
  • 2 Кроме того, вы сказали, что хотели бы выделить свое имя голубым цветом, а другие — синим жирным шрифтом; но ваш исходный код на самом деле попытался выполнить обратное :, если (имя автора)не является(моим собственным именем пользователя ), выделите голубым цветом, иначе выделите жирным синим цветом . Я придерживаюсь вашего описания.
  • 3\xявляется расширением GNU sed , ваш пробег может отличаться, если вы используете это в системе, отличной от -GNU.
2
27.01.2020, 22:02

[ ! %an = "my own user name" ]всегда верно, потому что %anникогда не будет равно вашему имени пользователя или любому другому имени пользователя в этом отношении :единственное, чему оно равно, это %an, потому что это просто буквальная строка, насколько Баш обеспокоен. Он имеет только особое значение ("имя автора")в git .

Возможно, есть умный способ сделать то, что вы хотите, но я не могу придумать ни одного банкомата. И я не думаю, что вы можете сделать это, смешав bash и git, как вы пытаетесь сделать. Если есть такое решение, оно, скорее всего, будет крайне неуклюжим :вам в основном придется прыгать между уровнем bash и уровнем git, при этом git перебирает все коммиты, но каким-то образом сообщает bash имя автора на каждый коммит, чтобы уровень bash мог указать git, какой цвет использовать.

Если это можно сделать, я думаю, что это, вероятно, будет чистое решение git, а не смесь bash и git.

2
27.01.2020, 22:02

Просто ради хорошей практики:

Variables hold data. Functions hold code. Don't put code inside variables!

См. вики-шерсть

-1
27.01.2020, 22:02

Теги

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