grep два слова рядом друг с другом - PullRequest
3 голосов
/ 06 марта 2011

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

grep -ERHn "\beasiest\W+(?:\w+\W+){1,6}?place\b" *

, который работает и дает мне линию.Но когда я делаю

grep -ERHn "\beasiest\W+(?:\w+\W+){1,10}?new\b" *

, это терпит неудачу, нанося поражение всему смыслу {1,10}? Это перечислено на сайте регулярно-expression.info, а также параRegex книг.Хотя они не описывают это с помощью grep, но это не должно иметь значения.

Обновление

Я поместил регулярное выражение в скрипт на python.Работает, но не имеет хорошей вещи grep -C ...

#!/usr/bin/python
import re
import sys
import os

word1 = sys.argv[1]
word2 = sys.argv[2]
dist = sys.argv[3]
regex_string = (r'\b(?:' 
    + word1  
    + r'\W+(?:\w+\W+){0,'
    + dist
    + '}?'
    + word2 
    + r'|'
    + word2
    + r'\W+(?:\w+\W+){0,'
            + dist
    + '}?'
    + word1
    + r')\b')

regex = re.compile(regex_string)


def findmatches(PATH):
for root, dirs, files in os.walk(PATH):
    for filename in files:
        fullpath = os.path.join(root,filename)

        with open(fullpath, 'r') as f:
            matches = re.findall(regex, f.read())
            for m in matches:
                print "File:",fullpath,"\n\t",m

if __name__ == "__main__":  
    findmatches(sys.argv[4])    

Называть его

python near.py charlie winning 6 path/to/charlie/sheen

работает для меня.

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Тебе действительно нужна структура заблаговременного просмотра?Может быть, этого достаточно:

grep -ERHn "\beasiest\W+(\w+\W+){1,10}new\b" * 

Вот что я получаю:

echo "This is perhaps the easiest place to add new functionality." | grep -EHn "\beasiest\W+(\w+\W+){1,10}new\b"

(стандартный ввод): 1: Это, пожалуй, самое простое место для добавления новых функций.

Редактировать

Как сказала Камиль Гудесюн:

Чтобы сделать его удобным для использования, его можно добавить в .bashrc:

grepNear() {
 grep -EHn "\b$1\W+(\w+\W+){1,10}$2\b"
}.

Затем по приглашению bash: echo "..." | grepNear easiest new

0 голосов
/ 04 октября 2011

grep не поддерживает группы без захвата регулярных выражений Python.Когда вы пишете что-то вроде (?:\w+\W+), вы спрашиваете grep, что соответствует вопросительному знаку ?, за которым следует двоеточие :, за которым следует один или несколько символов слова \w+, за которыми следует один или несколько несловарных символов \W+.? - это специальный символ для grep регулярных выражений, конечно, но поскольку он следует за началом группы, он автоматически экранируется (так же, как регулярное выражение [?] соответствует знаку вопроса).

Давайте проверим это?У меня есть следующий файл:

$ cat file
This is perhaps the easiest place to add new functionality.

grep не совпадает с используемым выражением:

$ grep -ERHn "\beasiest\W+(?:\w+\W+){1,10}?new\b" file

Затем я создал следующий файл:

$ cat file2
This is perhaps the easiest ?:place ?:to ?:add new functionality.

Обратите внимание, что каждому слову предшествует ?:.В этом случае ваше выражение соответствует файлу:

$ grep -ERHn "\beasiest\W+(?:\w+\W+){1,10}?new\b" file2
file2:1:This is perhaps the easiest ?:place ?:to ?:add new functionality.

Решение состоит в том, чтобы удалить ?: выражения:

$ grep -ERHn "\beasiest\W+(\w+\W+){1,10}?new\b" file
file:1:This is perhaps the easiest place to add new functionality.

Поскольку вам даже не нужнозахват группы (по крайней мере, насколько я видел) не несет никаких проблем.

Бонусный балл : вы можете упростить выражение своего лица, изменив {1,10} на {0,10} и удаливследующие ?:

$ grep -ERHn "\beasiest\W+(\w+\W+){0,10}new\b" file
file:1:This is perhaps the easiest place to add new functionality.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...