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'
это сочетает в себе:
- Как перечислить все текстовые (не двоичные) файлы в репозитории git?
- https://unix.stackexchange.com/questions/112132/how-can-i-grep-patterns-across-multiple-lines/112134#112134
Вывод четко показывает имя файла и номер строки, например:
myfile.txt:123:my
love
myfile.txt:234:my
life
otherfile.txt:11:my
lion
Протестировано на Ubuntu 22.04.