2013-05-23 7 views
3

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

Например:

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 и игнорировать эти строки с только совпадения в комментариях?

ответ

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

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

2

Вы можете вынуть комментарии первым:

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

Это будет по-прежнему не в некоторых случаях, если строка содержит слово УГЛА или апостроф. Чтобы точно решить эту проблему, вам нужно будет написать парсер вместо использования регулярных выражений.

+0

Я даже не думал о буквальных строках кода. Хороший улов! –

 Смежные вопросы

  • Нет связанных вопросов^_^