git grep <регулярное выражение, содержащее перевод строки>

Я пытаюсь отобразить все разрывы строк после некоторых бинарных операторов в проекте, используя git bash на компьютере с Windows.

Пробовал следующие команды, которые не работали:

$ git grep "[+-*\|%]\ *\n"
fatal: command line, '[+-*\|%]\ *\n': Invalid range end

$ git grep "[+\-*\|%]\ *\n"
fatal: command line, '[+\-*\|%]\ *\n': Invalid range end

Хорошо, я не знаю, как включить "-" в набор символов, но все же после его удаления \n соответствует персонажу n в прямом смысле:

$ git grep "[+*%] *\n"
somefile.py:            self[:] = '|' + name + '='
                                      ^^^

Избегать обратной косой черты один раз (\\n) не имеет никакого эффекта, и избегая его дважды (\\\n) заставляет регулярное выражение совпадать \n (в прямом смысле).

Какой правильный способ grep здесь?

2 ответа

Решение

Я не знаю, как включить "-" в набор символов

Нет необходимости убегать от символа черты (-), если вы хотите включить его в набор символов. Если вы установите его первым или последним символом в наборе, он не будет иметь особого значения.

Также нет необходимости убегать | внутри диапазона символов. Помимо ^ (когда это первый символ в диапазоне), - (когда это не первый или последний символ в диапазоне), ] а также \ (когда он используется, чтобы убежать ]), все остальные символы имеют буквальное значение (то есть не имеют специального значения) в диапазоне символов.

Там же нет необходимости ставить \n в регулярном выражении По умолчанию инструменты grepping пытаются сопоставить регулярное выражение с одной строкой за раз и git grep делает то же самое. Если вам нужно сопоставить регулярное выражение только в конце строки, тогда поставьте $ (конец строки привязки) в качестве последнего символа регулярного выражения.

Ваше регулярное выражение должно быть [-+*|%] *$,

Соберите вместе, полная командная строка:

git grep '[-+*|%] *$'

Как найти новую строку в середине строки

Из-за отсутствия лучшего варианта я думаю, что начну с:

      sudo apt install pcregrep
git grep --cached -Il '' | xargs pcregrep -Mb 'y\nl'

это сочетает в себе:

Вывод четко показывает имя файла и номер строки, например:

      myfile.txt:123:my
love
myfile.txt:234:my
life
otherfile.txt:11:my
lion

Протестировано на Ubuntu 22.04.

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