Поиск замазки - строка, за которой следуют один, но не два символа - PullRequest
0 голосов
/ 05 февраля 2019

Я ищу строку в пути / home / folder /, которая содержит несколько файлов .txt и .xls.Существуют случаи, когда определяется переменная xyz.Примером может быть: «xyz = if ... else ...»

Существуют также случаи, когда переменная xyz используется в качестве условия.Примером может быть: ".... xyz == 1 ..."

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

grep --include=\*.{txt,xls} -rnw '/home/folder/' -e 'xyz\s*\=(?!=)'
grep --include=\*.{txt,xls} -rnw '/home/folder/' -e 'xyz\s*\=(?!\=)'
grep --include=\*.{txt,xls} -rnw '/home/folder/' -e 'xyz\s*\=[^=]'

Я думаю, что мой синтаксис правильный, но результаты не возвращаются.Я пытался использовать разные оболочки, но это не имело никакого значения.Как мне искать строку в этом случае?

РЕДАКТИРОВАТЬ: я знаю, что экземпляры "xyz = ifelse" присутствуют в файлах в каталоге.Они появляются, когда я ищу с помощью следующей команды:

grep --include=\*.{txt,xls} -rnw '/home/folder/' -e 'xyz\s*\='

1 Ответ

0 голосов
/ 06 февраля 2019

Обе подсказки Mark и tink верны: вам нужно будет добавить параметр -P и избавиться от -w, используя вместо этого \b:

$ cat test.txt 
xyz = 14
xyz == 15
xyz=1
xyz==2
xyzz=4
zxyz=5

# No PCRE, no (correct) result
$ grep -e "xyz\s*\=(?!=)" test.txt 

# Missing instances without space between operator and value here
$ grep -P -w -e "xyz\s*\=(?!=)" test.txt 
xyz = 14

# Not checking for word boundary returns false positives
$ grep -P -e "xyz\s*\=(?!=)" test.txt 
xyz = 14
xyz=1
zxyz=5

# This is the result you want to see
$ grep -P -e "\bxyz\s*\=(?!=)" test.txt 
xyz = 14
xyz=1

# The same without PCRE
$ grep -e "\<xyz\s*\=[^=]" test.txt
xyz = 14
xyz=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...