regex – поиск только пар символов

У меня есть следующие данные, из которых я хочу извлечь только те строки, которые содержат только «bb». Не «b» или «bbb» или что-то еще просто «bb».

abb abbb aabbcc aabab abbbbc 

Теперь, когда я использую следующую комбинацию команд:

 cat file1 | grep "bb[^b] 

Я получаю вывод как все строки в моем файле образца:

 abb abbb aabbcc aabab abbbbc 

Ожидаемый я хочу – 🙁 Строки, содержащие только «bb»)

 abb aabbcc 

Какое регулярное выражение может быть достигнуто?

abbbabb недействителен. Я ищу строки, которые содержат только bb и никакой другой шаблон b . Строка будет содержать только два, последовательных b и никаких других символов b вообще.

  • grep -f сбой в файле, отредактированном в Windows
  • В каком порядке цикл bash FOR IN захватывает файлы в папке?
  • Совпадение всех шаблонов из файла сразу
  • Что такое эквивалент шаблона .gitignore регулярного выражения (Big | Small) (State | City) - * \. Csv
  • Скопируйте все точечные файлы, кроме `.git` и` ..`
  • Удалите все файлы, к которым не существует соответствующий файл с другим расширением.
  • Рисунок Grep и шаблон в шаблоне
  • Почему grep обрабатывает строку ebug 'по-разному?
  • 2 Solutions collect form web for “regex – поиск только пар символов”

    Я думаю, самый прямой способ:

     grep '^[^b]*bb[^b]*$' file1 

    Btw, для команд, таких как grep которые принимают аргумент имени файла, более эффективно выполнять

     grep '^[^b]*bb[^b]*$' file1 

    или

     grep '^[^b]*bb[^b]*$' < file1 

    (последний работает, если аргумент файла не поддерживается)

    чем

     cat file1 | grep '^[^b]*bb[^b]*$' 

    и часто более гибкими.

     grep '\(^\|[^b]\)bb\([^b]\|$\)' 

    или

     grep -E '(^|[^b])bb([^b]|$)' 

    То есть: поиск вхождения bb , которому предшествует либо начало строки, либо символ, отличный от b , за которым следует либо символ, отличный от b либо конец строки.

    Linux и Unix - лучшая ОС в мире.