如何在空格之间使用grep以获得完整的单词?

时间:2019-04-02 18:00:10

标签: grep whitespace

我有一组文本文件和一组关键字,需要在这些文件中查找。但是,我只对匹配“完整单词”感兴趣,即匹配空格之间的字符串。例如,如果我有文字

line1: word1 word2,
line2: word3 word22
line3: word4 aword2

如果我搜索word2,我只希望获得line1而不是2或3。另外,我需要知道匹配发生的行,所以我不能将每个文本文件放在一袋单词中并在其中搜索。

我可以使用grep吗?如果是这样,怎么办?还是有更好的选择?

另外,例如,如果我想搜索短语,是否可以正常工作

line1: word1 word word2,
line2: word3 word word22
line3: word4 wword word2

如果我要搜索“单词word2”,应该只产生第1行

3 个答案:

答案 0 :(得分:2)

在这里您可以使用grep及其所有选项:

  

-w, --word-regexp :仅选择那些包含组成整个单词的匹配项的行。测试是匹配的子字符串必须在行的开头,或者必须在非单词组成字符之前。同样,它必须在行的末尾,或后跟非单词组成字符。单词构成的字符是字母,数字和下划线。

     

来源:man grep

$ grep -w word2 file

答案 1 :(得分:1)

我认为您正在寻找类似的东西

grep -E "(^|\W)word2($|\W)" mytestfile.txt

同一件事也适用于您的第二种情况

grep -E "(^|\W)word word2($|\W)" mytestfile.txt

-E用于扩展正则表达式(egrep)。 (^ | \ W)将匹配行的开头或非字母数字字符(^ a-zA-Z0-9)。 ($ | \ W)将匹配行尾或非字母数字字符。

我在OSX上进行了测试,但是我认为它几乎可以在几乎所有系统上运行(GNU Grep也具有-E选项)。

答案 2 :(得分:0)

当心pcre2grep的用户!在正则表达式中使用-w选项或\ W不适用于重音字符。例如,使用“((^ | \ W)class($ | \ W)””也会导致以下两行也被匹配:

  

“ Versetdéclassé”,

     

“déclassé段”,

从此示例中可以看到,带重音符号的e不被认为是构词字符。

(注意:我正在使用pcre2grep 1022-GNU grep 2.0d)