2015-09-07 2 views
-3

Я хочу найти слово «включено» в качестве префикса или суффикса строки, но не там, где она находится посередине.Команда Linux для поисковой подстроки

В качестве примера, У меня есть текст с надписью «on», «one», «cron», «stone». Я хочу найти строки, содержащие точное слово «on», а также слова типа «один» и «cron», но он не должен соответствовать камню.

+1

Слова * как * «один» и «cron», но не «камень». Итак ... нет сибилянтов? Абстрактные существительные? Возможно, вы можете использовать флаг 'do-what-I-mean'. – Beta

+0

Попытайтесь использовать команду: grep –

+0

Каково правило, что должно и не должно быть включено. – Simba

ответ

0

Если вы только собираетесь «все из» и ищет что-нибудь с подстроки «на» в ней (выезд из «камень») ...

grep '[A-Za-z]on[A-Za-z]' <your file name> | grep -v 'stone' 

труб в команду grep снова будет скрыть любой из результатов, которые были «stone»

+0

'on' может быть только префиксом или суффиксом. но не там, где он посередине. –

+0

Вы должны добавить это к своему первоначальному сообщению, потому что это не сразу очевидно. – Matt

+0

Обратите внимание, что этот ответ был предоставлен до выяснения вопроса. –

1

Вы можете использовать egrep (regex), чтобы поймать точные фразы: используя \b (граница слова), вы можете быть уверены, что не поймаете ничего, кроме 3 слова:

egrep -e '\b(on|one|cron)\b' <filename> 

UPDATE:

Поскольку вопрос был отредактирован & уточнил, что ОП хочет иметь on «в качестве префикса или суффикса строки»:

egrep -e '\bon|on\b' <filename> 
+0

Обратите внимание, что этот ответ был предоставлен до выяснения вопроса. –

+0

@JonathanLeffler благодарит вас за комментарий! – alfasin

+0

YW: Вы можете посмотреть мой комментарий к [triplee] (http://stackoverflow.com/users/874188/tripleee) [ответ] (http://stackoverflow.com/a/32431664/15168) , Это относится к вашему текущему обновлению. –

2

Если вы получили GNU grep или BSD grep, то относительно прямолинейно:

grep -E '\b(on[[:alpha:]]*|[[:alpha:]]*on)\b' 

Это выглядит п или словом, за которым следуют «on» и нулевые или более буквенные символы, или для нулевых или более буквенных символов, за которыми следует «on», за которым следует граница слова.

Например, учитывая данные:

on line should be selected 
cron line should be selected 
stone line should not be selected 
station wagon 
onwards, ever onwards. 
on24 is not selected 
24on is not selected 

Пример запуска:

$ grep -E '\b(on[[:alpha:]]*|[[:alpha:]]*on)\b' data 
on line should be selected 
cron line should be selected 
station wagon 
onwards, ever onwards. 
$ 

С строгим POSIX-совместимых grep, вы должны работать намного тяжелее, если это может быть сделано вообще.

Обратите внимание, что это решение предполагает, что смешанные цифры и буквы не являются «словом» в этом контексте (поэтому не должны выбираться ни on24, ни 24on). Если вы не возражаете цифры, появляющиеся как часть слова начала или окончания «на», то вы можете использовать любой из двух других ответов:

или вы можете взломать это в форму, чтобы он делал то, что делает один из них.

+0

Да. вот и все. Спасибо. –

+0

Обратите внимание на решение @tripleee - если тот факт, что он принимает '24on' и' on24', в порядке, затем используйте его, потому что он проще (или мой может быть сведен к эквиваленту, отбрасывая '[[: alpha:]] * 'термины). –

+0

Но это тоже делает, потому что у вас есть нулевой или более квантификатор в классе символов [[: alpha:]] '. Если вы сбросите квантификатор, он будет более строгим * и * более эффективным. – tripleee

2

Я удивлен, что никто не предложил простой, очевидно

grep -E '\<on|on\>' files ... 

Метасимвол последовательности \< и \> матч левой и правой границы слова, соответственно. Я считаю, что он должен быть переносимым на любую современную платформу (хотя я бы не удивился, если Solaris, HP-UX или AIX потребовали некоторых настроек, чтобы заставить его работать).

+0

Приятный и простой. Однако он принял бы 'on24' или' 24on'; четко не определено, нормально это или нет. –