grep 确切的单词

grep 确切的单词

样本文件:

t2csi1m9@olth101 [bundleversion_sync]$ cat 1
arun:1.0
arun_kumar:1.2
arun-vinoth:1.3
arun_arun:1.4
t2csi1m9@olth101 [bundleversion_sync]$

t2csi1m9@olth101 [bundleversion_sync]$ grep -w 'arun' 1
arun:1.0
arun-vinoth:1.3
t2csi1m9@olth101 [bundleversion_sync]$

当我 grep arunin file时1,我得到 2 个输出,而我只需要第一个输出。 ( arun:1.0)。

答案1

是的,您会得到两个匹配项,因为 和 都arun:1.0包含arun-vinoth:1.3该单词arun作为单独的单词,在非单词字符之前结束:,并且-在两个结果中 (_被视为单词字符,这就是arun_kumar:1.2为什么不是根据您的命令返回)。

在这种情况下,最好使用^arun:作为搜索模式,即以字符串 开头的任何行arun:

答案2

的定义单词forgrep -w是字母数字或下划线字符的序列(在区域设置中或仅限于 ASCII,具体取决于实现/版本,如果您搜索的内容不以单词字符开头或结尾,则行为会有所不同)。

一些工具,例如zsh, vim,xterm可以让您自定义定义单词。但grep据我所知,没有任何实现。所以如果你需要另一个定义单词,您需要自己以其他方式实现它。

例如,如果您的单词定义应该是除冒号,你会这样做:

grep -E '(^|:)arun(:|$)'

arun在 ( |) 行的开头 ( ^) 或 a之后:,然后跟 a:或行的结尾 ( $))。

或者使用标准的基本正则表达式:

grep '^\(.*:\)\{0,1\}arun\(:.*\)\{0,1\}$'

(行的开头 ( ^),可选地 ( ) 后跟以结尾的\{0,1\}字符序列 ( ) ,后跟,可选地后跟以 ( ) 开头的字符序列和行结尾 ( ))。.*:arun:$

或者使用 PCRE(除了上面的 ERE 变体之外,PCRE 也支持)

grep -P '(?<![^:])arun(?![^:])'

arun前提是它是不在前面(?<!...)负后视运算符)后面也不能跟除( )(?!...)以外的字符;您还可以使用 with (仅输出单词),(返回其在输入中的偏移量),(突出显示单词),例如 with ):[^:]grep -ogrep -bgrep --color-w

或者如果你的单词定义应该是正常的单词( [[:alnum:]_]) 加连字符:

grep -E '(^|[^[:alnum:]_-])arun([^[:alnum:]_-]|$)'

等等。

相关内容