Как выделить несколько совпадений? - PullRequest
1 голос
/ 19 октября 2019

У меня есть функция оболочки (которую я использую в Zsh, но она должна работать в Bash), которая выделяет соответствующий текст в выводе, поэтому я могу быстро находить вещи.

function highlight() {
  perl -pe "s/$1/\e[1;31;43m$&\e[0m/g"
}

Это очень удобно,но это работает только с одним аргументом. Если бы у меня было фиксированное количество аргументов, я мог бы сделать что-то вроде:

perl -pe "s/abc/def/; s/fgh/hij/;"

, но, конечно, это безумие. Как я могу заставить эту работу работать с неопределенным числом аргументов?

Мой конкретный вариант использования (в случае, если это имеет значение) - это передать через него список ветвей Git и выделить вывод $(git branch --no-merged master)в списке, чтобы я мог видеть все незакрепленные ветви, выделенные в контексте большего списка всех ветвей.

1 Ответ

1 голос
/ 19 октября 2019

Вы можете легко сделать это, используя специальный параметр в bash и упростив ваше регулярное выражение perl. Я могу объяснить их оба немного подробнее:

Специальный параметр Bash / Zsh

См. Справочную страницу для получения дополнительной информации. (https://tiswww.case.edu/php/chet/bash/bashref.html#Special-Parameters)

В bash вы можете получить доступ ко всем аргументам, переданным функции, используя специальный параметр $*, это позволяет вам легко обрабатывать переменное число параметров. В вашем случае вы хотитенайдите и выделите каждое из переданных значений. Приятной особенностью $* является то, что он будет разделять параметры по значению, установленному для переменной IFS.

Multi-Matching RegularВыражение

Вместо того, чтобы дублировать логику сопоставления путем добавления дополнительных правил, вы можете просто использовать условное выражение OR в своем выражении для поиска нескольких слов в документе. Это делается путем добавления канала (|) между искомыми словами.

Собрав все это вместе, мы можем использовать функцию, подобную этой, для поддержки поиска нескольких слов в документе.

function highlight() {
  IFS='|'
  perl -pe "s/$*/\e[1;31;43m$&\e[0m/g"
}

ThisЭто довольно простой пример, и он будет даже работать правильно, если ваша целевая строка содержит пробелы, подобные этому:

highlight "my string"

...