git grep и несколько предложений с помощью ИЛИ с вертикальной чертой? - PullRequest
0 голосов
/ 08 мая 2020

Я хочу найти несколько предложений с помощью grep - и я знаю, что можно использовать конвейер | для ИЛИ предложений; Итак, вот тест, который я пробую на MSYS2, Windows 10:

$ uname -s
MSYS_NT-10.0-18363
$ git --version
git version 2.25.2
$ grep --version | head -1
grep (GNU grep) 3.0

$ git clone https://github.com/xythobuz/avrSerial.git
...
$ cd avrSerial/

$ grep -r 'SERIALDATA\|UART_INTERRUPT_MASK' . --include='*.[ch]'
./serial.c:#define SERIALDATA  0
./serial.c:    rxBuffer[uart][rxWrite[uart]] = *serialRegisters[uart][SERIALDATA];
./serial.c:        *serialRegisters[uart][SERIALDATA] = sendThisNext[uart];
./serial.c:            *serialRegisters[uart][SERIALDATA] = txBuffer[uart][txRead[uart]];
./serial.c:            serialRegisters[uart]->CTRLA &= ~(UART_INTERRUPT_MASK << 2); // TXCINTLVL
./serial_device.h:#define UART_INTERRUPT_MASK 0x03

Итак, просто grep отлично работает здесь, с несколькими предложениями с трубкой.

Однако, Я хотел бы знать, в каких функциях C встречаются совпадения предложений / ключевых слов, поэтому я пытаюсь использовать git grep с переключателем -p:

$ git grep -p 'SERIALDATA\|UART_INTERRUPT_MASK' -- '*.[ch]'
$

... и абсолютно ничего возвращается для того же предложения.

Однако, если я повторю этот тест на Ubuntu:

$ echo `uname -s` `cat /etc/issue | head -1`
Linux Ubuntu 18.04.4 LTS \n \l
$ git --version
git version 2.17.1
$ grep --version | head -1
grep (GNU grep) 3.1

# same procedure with git clone, cd ... grep -r works the same too; but git grep -p is different:

$ git grep -p 'SERIALDATA\|UART_INTERRUPT_MASK' -- '*.[ch]'
serial.c:#define SERIALDATA  0
serial.c=static void serialReceiveInterrupt(uint8_t uart) {
serial.c:    rxBuffer[uart][rxWrite[uart]] = *serialRegisters[uart][SERIALDATA];
serial.c=static void serialTransmitInterrupt(uint8_t uart) {
serial.c:        *serialRegisters[uart][SERIALDATA] = sendThisNext[uart];
serial.c:            *serialRegisters[uart][SERIALDATA] = txBuffer[uart][txRead[uart]];
serial.c:            serialRegisters[uart]->CTRLA &= ~(UART_INTERRUPT_MASK << 2); // TXCINTLVL
serial_device.h=uint8_t const serialBits[UART_COUNT][UART_BITS] = {{
serial_device.h:#define UART_INTERRUPT_MASK 0x03

... вот это работает?!

Кто-нибудь знает почему различное поведение по отношению к git grep в этих системах? Есть ли параметр конфигурации git, который я должен включить, или это регресс в git, или, может быть, есть проблемы с экранированием оболочки на MSYS2?

Или в целом - как я могу получить то же самое своего рода ответ git grep на MSYS2, как я получаю его на Ubuntu?

1 Ответ

0 голосов
/ 09 мая 2020

Я отправлю это как ответ - после изучения git help grep и перебора некоторых переключателей обнаружил, что это работает на MSYS2:

$ git grep -p --extended-regexp 'UART_INTERRUPT_MASK|SERIALDATA' -- '*.[ch]'
serial.c:#define SERIALDATA  0
serial.c=static void serialReceiveInterrupt(uint8_t uart) {
serial.c:    rxBuffer[uart][rxWrite[uart]] = *serialRegisters[uart][SERIALDATA];
serial.c=static void serialTransmitInterrupt(uint8_t uart) {
serial.c:        *serialRegisters[uart][SERIALDATA] = sendThisNext[uart];
serial.c:            *serialRegisters[uart][SERIALDATA] = txBuffer[uart][txRead[uart]];
serial.c:            serialRegisters[uart]->CTRLA &= ~(UART_INTERRUPT_MASK << 2); // TXCINTLVL
serial_device.h=uint8_t const serialBits[UART_COUNT][UART_BITS] = {{
serial_device.h:#define UART_INTERRUPT_MASK 0x03

, а также это:

$ git grep -p --perl-regexp 'UART_INTERRUPT_MASK|SERIALDATA' -- '*.[ch]'
serial.c:#define SERIALDATA  0
serial.c=static void serialReceiveInterrupt(uint8_t uart) {
serial.c:    rxBuffer[uart][rxWrite[uart]] = *serialRegisters[uart][SERIALDATA];
serial.c=static void serialTransmitInterrupt(uint8_t uart) {
serial.c:        *serialRegisters[uart][SERIALDATA] = sendThisNext[uart];
serial.c:            *serialRegisters[uart][SERIALDATA] = txBuffer[uart][txRead[uart]];
serial.c:            serialRegisters[uart]->CTRLA &= ~(UART_INTERRUPT_MASK << 2); // TXCINTLVL
serial_device.h=uint8_t const serialBits[UART_COUNT][UART_BITS] = {{
serial_device.h:#define UART_INTERRUPT_MASK 0x03

Итак, используйте --perl-regexp или --extended-regexp - и не выходите из трубы | с помощью backsla sh \, как это необходимо для обычного grep.

...