регулярное выражение grep для игнорирования комментария в конце строки

Я пытаюсь просмотреть множество старых исходных файлов PowerBASIC в поисках переменной, но у меня возникают проблемы с получением grep, чтобы избежать сопоставления ссылок на переменную в комментариях в конце строки.

Например:

ANGLE = 40    ' THIS IS A COMMENT ABOUT ANGLE'S VALUE
FOO = 3/ANGLE ' ANGLE CAN APPEAR ON RIGHT SIDE AS WELL
DELTA = 35    ' ANGLE AND DELTA AREN'T FRIENDS

Изначально я использовал:

# grep "\bANGLE\b.*'" SRC_FILE.BAS

Но, помимо игнорирования строк без комментариев, он также выводит строки кода, в которых ANGLE вообще не используется (например, строка DELTA). Это связано с тем, что эти строки также содержат одиночный апостроф (') в своих комментариях (например, AREN'T).

Я подумал о том, чтобы вывести вывод, чтобы удалить строки, которые мне не нужны:

# grep "\bANGLE\b" SRC_FILE.BAS | grep -v "'.*\bANGLE\b"

Но, к сожалению, он также удаляет строки кода, которые мне нужны, которые просто имеют «ANGLE» в своих комментариях.

Как заставить grep сопоставлять строки фактического кода, включающие ANGLE, и игнорировать строки с только совпадениями в комментариях?


person Vilhelm Gray    schedule 23.05.2013    source источник


Ответы (2)


grep "^[^']*\bANGLE\b" SRC_FILE.BAS

Это соответствует только строкам, в которых все слева от ANGLE не включает '. У него будет проблема, аналогичная решению jnylen, если в строке есть апостроф.

person Barmar    schedule 23.05.2013

Вы бы сначала удалили комментарии:

sed "s/'.*$//" SRC_FILE.BAS | grep '\bANGLE\b'

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

person We Are All Monica    schedule 23.05.2013
comment
Я даже не думал о буквальных строках в коде. Хороший улов! - person Vilhelm Gray; 23.05.2013