Как искать строку, которая имеет ": "в начале с grep в bash?

Как искать строку, которая имеет ": "в начале с grep в bash?

20.01.2020 08:12:36 Просмотров 30 Источник

Я получаю количество появлений определенной строки в файле с:

grep -o "\bstring \b" $file | wc -l

Но когда у меня есть строка типа ":2_n", эта строка имеет ":" в начале, и в этом случае grep не работает, он дает мне счет 0 каждый раз, даже если мой файл имеет кратные ":2_n" Как я могу это сделать? Спасибо.

Мой файл выглядит так

:2_n nE Ea an no o:2 :2_n _na 

Если я использую grep, чтобы увидеть количество появлений": 2_n"

grep -o "\b:2_n \b" $file | wc -l

grep дает мне 0, с другими строками это работает отлично, проблема в строках, которые имеют ": "в начале

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59828091/how-to-search-a-string-that-the-have-at-the-beginning-with-grep-in-bash#comment105792962_59828091
Попробуйте с "grep-F" \bstring \b " $file | wc-l
https://stackoverflow.com/questions/59828091/how-to-search-a-string-that-the-have-at-the-beginning-with-grep-in-bash#comment105793482_59828091
Я просто обновляю свой вопрос примером, моя строка": 2_n " имеет пробел сразу после.
https://stackoverflow.com/questions/59828091/how-to-search-a-string-that-the-have-at-the-beginning-with-grep-in-bash#comment105793682_59828091
это была глупая ошибка, удаление инициала /b исправило ее, Спасибо большое Тоби и Бармару

Ответы - Как искать строку, которая имеет ": "в начале с grep в bash? / How to search a string that the have ":" at the beginning with grep in bash?

Является ответом!
tshiono

21.01.2020 02:30:00

Как Barmar объясняет, выражение \b матчей на границе между символ слова (буквенно-цифровой плюс "_") и не-символ слова (другие символы, кроме слова).

Как строка:2_nначинается с символа без слов и заканчивается словом символ, он не подходит для использования \b, чтобы извлечь строку из предложение.
Давайте рассмотрим примеры.

^:2_n    ("^" indicates the start of line)
 | Both "^" and ":" are non-word characters hence "\b" doesn't match.

:2_n :2_n
     | Both " " and ":" are non-word characters hence "\b" doesn't match.

Предположим, что ваша строка определена как последовательность непустых символов), разделенные пробелом , вы можете сказать вместо этого:

grep -Po "(^|(?<=\s)):2_n((?=\s|$))" file | wc -l
  • Опция-Pдля grepвключает Perl-совместимое регулярное выражение.
  • Шаблон (^|(?<=\s))является утверждением lookbehind нулевой ширины и соответствует началу строки или предшествующему пустому символу без включения это в результате.
  • Узор ((?=\s|$))является утверждением lookahead нулевой ширины и соответствует концу строки или следующему пустому символу без включения это в результате.

Параметр-Pможет не поддерживаться в зависимости от версии grep. Пожалуйста, дайте мне знать в таком случае.

https://stackoverflow.com/questions/59828091/how-to-search-a-string-that-the-have-at-the-beginning-with-grep-in-bash/59832242#comment105825314_59832242
Опция-P работала, но очень медленно
https://stackoverflow.com/questions/59828091/how-to-search-a-string-that-the-have-at-the-beginning-with-grep-in-bash/59832242#comment105840040_59832242
Тогда, пожалуйста, попробуйте ripgrepвместо этого. Это намного быстрее, чем grep.
Закрыть X