如何在 bash 中用 grep 搜索以“:”开头的字符串?

How to search a string that the have ":" at the beginning with grep in bash?

我正在获取文件中特定字符串的出现次数:

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,对于其他字符串,它工作得很好,问题出在开头有“:”的字符串

正如 Barmar 所解释的那样,表达式 \b 在 一个 word 字符(字母数字加“_”)和一个 non-word 字符 (除 "word" 之外的其他字符)。

因为字符串 :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
  • grep-P 选项启用与 perl 兼容的正则表达式。
  • 模式 (^|(?<=\s)) 是一个零宽度的回顾断言,并且 匹配行首或前面的空白字符而不包括 它在结果中。
  • 模式 ((?=\s|$)) 是一个零宽度先行断言并且 匹配行尾或后面的空白字符而不包括 它在结果中。

可能不支持 -P 选项,具体取决于 grep 版本。 在这种情况下请告诉我。