如何在 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
版本。
在这种情况下请告诉我。
我正在获取文件中特定字符串的出现次数:
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
版本。
在这种情况下请告诉我。