“grep -w”命令不起作用

“grep -w”命令不起作用

我有以下输入:

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

-wfor 标志将使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 就更容易了。

相关内容