Подсчитать общее количество вхождений во всех строках во всех файлах в данной ветке репозитория git - PullRequest
1 голос
/ 18 января 2020

Я могу найти все строки, содержащие шаблон "моя строка" в одной ветви моего git репозитория, выполнив команду

git grep "my string" my_branch

Скажем, в результате получается

my_branch: file1: file1 Что такое " моя строка "?
my_branch: file2: file2 Здравствуйте, " моя строка " просто " моя строка"!

Мы видим 3 вхождения в две строки двух файлов. Я могу посчитать эти строки через

git grep "my string" my_branch | wc -l

Это приведет к

2

Вопрос в том, как получить точное число вхождений строк через все строки через все файлы в данной ветке? Можно ли запустить какую-нибудь команду или скрипт, который даст мне 3 в моем примере, а не 2 ?

Ответы [ 3 ]

2 голосов
/ 18 января 2020

Опция -o была введена в 2.18 . В предыдущих версиях вы можете использовать git show и комбинировать его со стандартным вызовом grep:

$ git show my_branch | grep -o 'my string' | wc -l
1 голос
/ 18 января 2020

Вы можете использовать -o в grep для вашего требования и передать его wc -l для счета:

Внутри man grep:

-o, --only-matching
              Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.

Это должно работа для вас:

git grep -o "my string" my_branch | wc -l

Обратите внимание, что для использования опции -o, версия git должна быть 2.18 или выше.

1 голос
/ 18 января 2020

Почему grep НЕ дает правильных результатов, потому что он ищет строку в каждой строке, и если строка имеет более 1 вхождения строки, то она также считается как 1 вхождение.

Пример grep не считая нескольких вхождений строки в одной строке:

Допустим, у нас есть следующий Input_file:

cat Input_file
test my_string
la bla bla
my_string
bla bla

Теперь, когда мы запускаем команду grep, она дает следующее:

grep "my_string" Input_file | wc -l
2

Теперь давайте поместим несколько вхождений строки в одну строку:

cat Input_file
test my_string
la bla bla
my_string my_string
bla bla

grep "my_string" Input_file | wc -l
2


Поэтому, если разрешено, вы можете попробовать awk там, где вам не нужно использовать 2 программы (grep + wc), также для команды git, взятой из ответа @ UnbearableLightness здесь.

git show my_branch |awk '{sum+=gsub(/my string/,"&")} END{print sum}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...