样本文件:
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 arun
in 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 -o
grep -b
grep --color
-w
或者如果你的单词定义应该是正常的单词( [[:alnum:]_]
) 加连字符:
grep -E '(^|[^[:alnum:]_-])arun([^[:alnum:]_-]|$)'
等等。