Git Grep Несколько слов на нескольких строках
Я бы хотел git grep
файлы, которые имеют два предварительно заданных слова (если оба существуют, т.е. AND
ing), предположим, что эти два слова 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 строками.