不使用(e)grep中的-v选项的模式中的单词排除

时间:2019-05-01 17:33:43

标签: regex linux grep

是否可以仅使用模式而不使用-v选项来排除(e)grep中的确切单词。例如,由于()将模式或确切的字符串()分组,所以我认为egrep [^(main)]将匹配没有确切的单词main的子字符串,但是发生的是它排除了字母{{1} }。我仍在用bash学习正则表达式。

3 个答案:

答案 0 :(得分:1)

您可以使用此否定的前瞻正则表达式来拒绝包含main作为整个单词的行,而不必一定使用-v

grep -P '^(?!.*\bmain\b).*$' bash.txt

在这里,-P启用Perl regular expression

之前是名为bash.txt的文件的内容,

hello 123
hello world
hello main world
some main text
some mainly text

在执行上述命令后,它将打印此输出,

hello 123
hello world
some mainly text

答案 1 :(得分:0)

原因

  

egrep [^(main)]不包括字母m,a,i,n。

是[^(main)]与括号中不包含的单个字符匹配,不仅排除了m,a,i,n,而且还排除了(和)。您可以找到此功能here的正确用法。

实际上,已经有一个类似的StackOverflow问题。它具有几种形式的否定性超前预测。 ^((?!main).)*$可能是其中之一,可以满足您的需求。

答案 2 :(得分:0)

idk(是否需要),但可以借用@Pushpesh's example,然后使用任何POSIX awk:

$ awk '!/(^|[^[:alpha:]])main([^[:alpha:]]|$)/' file
hello 123
hello world
some mainly text

或使用GNU工具确定单词边界:

$ awk '!/\<main\>/' file
hello 123
hello world
some mainly text

$ sed '/\<main\>/d' file
hello 123
hello world
some mainly text