соответствует числу с плавающей запятой, которое не находится внутри круглых скобок

Я пытаюсь сопоставить шаблон в куче файлов с помощью grep. Файлы содержат G-код (код станка с ЧПУ). С каждым номером должна быть связана буква (пример: X4.5, G71, Z-0.75). Во многих файлах есть опечатки и отсутствуют буквы. Я пытаюсь использовать grep для идентификации этих файлов, сопоставляя любые десятичные числа в файле, которым не предшествует буква. Однако я не хочу сопоставлять один и тот же шаблон, если шаблон находится в круглых скобках. Все, что заключено в скобки, является комментарием и не должно совпадать с регулярным выражением.

тестовый текст:

%
O01934 (AWC C011469)
(MATL: 4.0 X 2.0 X A020)
N90 G00 4.2 z0.1
Z0.1125 F0.004 
N150 X2.2 .01 (inline comment)
0.03

Строка 3 технически содержит шаблон, который я ищу, но я не хочу сопоставлять его, потому что он заключен в круглые скобки.

Строки 4, 6, 7 являются примерами шаблона, который я пытаюсь сопоставить. Числа, которым не предшествует буква и которые не заключены в круглые скобки.

Я сижу на regextester.com уже больше часа, и теперь у меня болит голова. Может быть, кто-то более опытный с регулярным выражением может помочь.

Лучший шаблон, который я смог понять, это ([[:space:]]|^)-?[[:digit:]]*\.[[:digit:]]+([[:space:]]|$). Что соответствует тому, что я хочу в 4, 6 и 7. Но также соответствует числам в комментарии к строке 3. Я не могу понять, как сопоставить одно, но не другое.


person PatMcTookis    schedule 05.12.2019    source источник
comment
Похоже, вы хотите pcregrep -o '\([^()]*\)(*SKIP)(*F)|(?<!\S)-?\d*\.\d+(?!\S)' file. Хотя вы говорите Числа, которым не предшествует буква, ваше регулярное выражение, которое вы пробовали, соответствует только числам между пробелами. Пожалуйста, уточните.   -  person Wiktor Stribiżew    schedule 05.12.2019
comment
Можете ли вы выделить то, что должно соответствовать, трудно сказать? Ничего, я изучу программное обеспечение ЧПУ и постараюсь ответить через несколько лет.   -  person    schedule 05.12.2019
comment
Спасибо. Я не собирался быть неточным. Мое регулярное выражение было лучшим, что я мог придумать. Я даже не понимаю ваше регулярное выражение, но оно работает. Спасибо!   -  person PatMcTookis    schedule 05.12.2019
comment
@ x15 Я не могу выделить текст в блоке кода. Строки 4,6,7: числа, которым не предшествует буква и не заключены в круглые скобки. Если вы не можете понять, к чему я веду это описание, то вы, вероятно, все равно не сможете мне помочь с этой проблемой.   -  person PatMcTookis    schedule 05.12.2019


Ответы (1)


Ваше регулярное выражение можно исправить и использовать как

pcregrep -o '\([^()]*\)(*SKIP)(*F)|(?<!\S)-?\d*\.\d+(?!\S)' file

Часть \([^()]*\)(*SKIP)(*F) соответствует любой подстроке внутри ближайших круглых скобок и опускает это совпадение, таким образом игнорируя любые возможные совпадения внутри круглых скобок.

Если вам нужно избегать совпадений только после буквы, замените (?<!\S) на (?<!\p{L}).

person Wiktor Stribiżew    schedule 05.12.2019
comment
Большое спасибо за разъяснения. В итоге я использовал grep -P вместо pcregrep -o с шаблоном, чтобы избежать необходимости устанавливать pcregrep для запуска скрипта. Работает в обе стороны. Спасибо! - person PatMcTookis; 05.12.2019