Я пытаюсь сопоставить шаблон в куче файлов с помощью 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. Я не могу понять, как сопоставить одно, но не другое.
pcregrep -o '\([^()]*\)(*SKIP)(*F)|(?<!\S)-?\d*\.\d+(?!\S)' file
. Хотя вы говорите Числа, которым не предшествует буква, ваше регулярное выражение, которое вы пробовали, соответствует только числам между пробелами. Пожалуйста, уточните. - person Wiktor Stribiżew   schedule 05.12.2019