Git Grep Несколько слов на нескольких строках

Я бы хотел git grep файлы, которые имеют два предварительно заданных слова (если оба существуют, т.е. ANDing), предположим, что эти два слова word1 а также word2

Я старался

git grep -e 'word1' --and -e 'word2'

А также я пытался

git grep 'word1'.*'word2'

но оба получают результаты, только если word1 а также word2 находятся на той же строке, а вторая не получает, если word2 идет первым в очереди, а это то, чего я не хочу.

Я хочу получить файлы, даже если два слова не находятся на одной строке (я не уверен, сколько строк разделяет их, и порядок не важен; любой порядок должен быть выбран).

Это возможно?

3 ответа

Поиск по многострочному с git-grep это невозможно.

Взято из: http://git.661346.n2.nabble.com/bug-git-grep-P-and-multiline-mode-td7613900.html

Да, и намеренно, чтобы не думать о таких вещах, как "как многострочный матч будет взаимодействовать с" grep -n "?"

Мы ведем себя так, как будто мы подаем каждую строку содержимого по одной строке за раз соответствующему механизму, который выбран параметрами -P / -E / -G / -F, поэтому это ограничение вряд ли изменится.

Ты можешь сделать

      git grep -l word1 |xargs grep -l word2

Опция перечисляет имя файла вместо соответствующей строки.

Это необходимо, чтобы передать их во второй правый grep (xargs — это служебная конвейерная функция)

Я полагаю, вы были бы счастливы с -lс правой стороны также, так как в противном случае были бы показаны строки, которые соответствуют word2без ссылки на word1.


Просто сейчас вижу комментарий @twalberg, который рекомендует аналогичное решение.

Что напоминает мне, если у вас проблемы с именами файлов, вам нужно несколько дополнительных аргументов:

      git grep -zl word1 |xargs -0 grep -l word2

Сgit-grepсопоставляет шаблоны в строке, напримерgrep, способ добиться этого - разбить проблему.

Сначала найдите все файлы с , в этих файлах найдите .

По сутиgit grep -l word1 | xargs git grep word2.

Более тщательным примером может быть что-то вроде

      git grep -z --name-only word1 |
  xargs -0 git grep -z --name-only word2 |
  xargs -0 grep -zPl 'word1.*\n{0,5}.*word2'

Это находит все файлы, гдеword2следуетword1, разделенные не более чем 5 строками.

Другие вопросы по тегам