我有以下输入:
csdi_d_trs_proc_uxs1 26 24
csdi_d_tdp_process_uxs1 28 32
我只需要包含proc
.当我使用时:
grep proc filename
这两行都是输出,所以我尝试使用grep -w proc filename
,但没有显示输出。
proc
我怎样才能得到只有但没有的线process
?
答案1
-w
for 标志将使grep
给定的表达式仅匹配整个单词。
“单词”是由“非单词字符”(或行的开头/结尾)包围的“单词字符”字符串。
您的情况的问题是_
(下划线) 恰好是一个“单词字符”,因此不能将单词proc
单独界定为单词。
-w
不要使用with ,而是grep
使用通过 显式分隔单词的模式_
:
grep '_proc_' filename
或者,如果您想用非小写字母字符的任何内容来分隔单词,请使用[^a-z]
而不是:_
grep '[^a-z]proc[^a-z]' filename
请注意,这不会proc
在行的开头/结尾识别为单词。
答案2
-w, --word-regexp
仅选择包含构成整个单词的匹配项的行。 [...] 单词组成字符是字母、数字和下划线。
在大多数编程语言(至少是 C、Perl、shell)中,下划线作为标识符的一部分是有效的,这可能就是它在这里被视为“单词字符”的原因。
仅匹配单词的一种方法是使用 Perl 正则表达式提供的否定前瞻和后瞻测试。这里的(?<![a-z])
意思是“前面没有小写字符,(?![a-z])
后面的字符也类似。行的开头和结尾不是小写字符,所以proc
即使在开头也会匹配:
pcregrep '(?<![a-z])proc(?![a-z])' filename
或者使用 grep ERE,明确考虑行的开头和结尾:
grep -E '(^|[^a-z])proc([^a-z]|$)' filename
(我不确定哪一个更漂亮。)
如果您有自然语言文本,[[:alpha:]]
可能比 更正确[a-z]
。
但当然,_proc_
如果您知道那里会有下划线,那么仅仅 grep 就更容易了。