2017-02-21 52 views
0

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

Пример текста:

jhgjgjgvocher_SOMETHINGHERE.dbhjjkghjkg 
vocher_SOMETHINGELSE.db 

Я ищу 'SOMETHINGHERE' и '' SOMETHINGELSE только.

vocher_ и .db всегда до и после соответствующей детали, но не должны быть в результате.

Рабочий раствор А:

cat test | egrep -o "vocher_.*\.db" | cut -d "_" -f2 | cut -d "." -f1 

... но вы знаете, что это некрасиво.

Можно ли искать точно для неизвестной части с регулярным выражением (в данном случае только часть .*), или мне нужно использовать что-то вроде sed? Есть ли лучшее решение?

+4

Попробуйте заменить 'egrep -o 'vocher _. * \ .db" 'с' grep -oP' (? <= Vocher _). *? (? = \. Db) "' –

+0

@Wiktor: Правильно, но нет требуется знак вопроса после звездочки. – JosefScript

+0

см. Также [Примеры Lookahead и Lookbehind в SO doc] (https://stackoverflow.com/documentation/regex/639/lookahead-and-lookbehind#t=201702220503256206195) – Sundeep

ответ

1

Простое решение с помощью Perl заключается в следующем:

perl -ne 'if (/vocher_(.*)\.db/){ print "$1\n";}' test_file.txt 

Эта итерацию линия за линией над файлом и печатает только нужную часть.

0

Используйте следующую Grep подход:

grep -Po '(?<=vocher_).+(?=\.db)' test 

-P - позволяет PERL регулярные выражения

-o - печатает только совпадающая подстрока

Выход будет, как показано ниже:

SOMETHINGHERE 
SOMETHINGELSE 
+0

Проблема с этим решением заключается в том, что он не использует дополнительную информацию, которую ОП имеет в своей проблеме. Он хочет, чтобы 'voucher_' предшествовал желаемому тексту, а файл должен быть' .db'. Если вы использовали этот код, вы получите все после подчеркивания, независимо от того, соответствует ли он другим условиям. – ahjohnston25

+1

@ ahjohnston25, я снова прочитал вопрос и исправил свое решение, теперь все в порядке – RomanPerekhrest