Grepping精确匹配/子串

时间:2014-09-16 09:34:33

标签: regex bash grep

我有一组看起来像这样的词:
fruits.txt

APPLE,2  
apple,3  
APPLE-ORANGE,3  
APPLEORANGE-GRAPE,5  

并尝试打印" apples"仅

这是我尝试过的,几乎所有具有类似问题的命令都返回相同的输出如下:
grep -iE "apple\b" fruits.txt
APPLE,2
苹果,3
APPLE-ORANGE,3 ##这是我想忽略的额外行

我也试过以下,但没有回复任何东西 grep -i '^apple$' fruits.txt

预期输出
APPLE,2
苹果,3

PS:请不要在grep -iE 'apple\b' fruits.txt | grep -v "-"上建议我不能在循环中使用此功能以防止greping" APPLE-ORANGE"再次使用它#l}< lll是个问题。

2 个答案:

答案 0 :(得分:2)

尝试:

grep -i 'apple[ ,]' fruits.txt 
grep -iP 'apple\b(?=[\s,])' fruits.txt

来自

APPLE,2
apple,3
APPLE-ORANGE,3
APPLEORANGE-GRAPE,5
applE , 8
AAple900

都打印

APPLE,2
apple,3
applE , 8

两个正则表达式都搜索不区分大小写的 apple ,然后搜索至少一个(空格)或,

如果您不想接受(空格),只需删除字符组...

或者,您应该向grep说明不允许遵循apple的内容,例如:

grep -iP 'apple[^\w-]' fruits.txt
grep -iE 'apple[^[:alnum:]-]' fruits.txt

搜索apple任何字符-后面没有的内容。

答案 1 :(得分:2)

您可以使用awk执行此任务:

$ awk -F, -v IGNORECASE=1 '$1 ~ /^apple$/' fruits.txt
APPLE,2  
apple,3

如果要传递awk要使用的shell变量,可以这样做:

$ fruit=apple
$ awk -F, -v IGNORECASE=1 -v FRUIT="^$fruit\$" '$1 ~ FRUIT' fruits.txt
APPLE,2  
apple,3