regex 如何使用grep排除一个单词?

ghhaqwfi  于 2022-12-27  发布在  其他
关注(0)|答案(9)|浏览(146)

我需要这样的东西:

grep ^"unwanted_word"XXXXXXXX
nlejzf6q

nlejzf6q1#

您可以使用grep的-v(对于--invert-match)选项来执行此操作,如下所示:

grep -v "unwanted_word" file | grep XXXXXXXX

grep -v "unwanted_word" file将过滤具有unwanted_word的线,并且grep XXXXXXXX将仅列出具有模式XXXXXXXX的线。

    • 编辑:**

从您的注解看,您似乎想列出所有没有unwanted_word的行。在这种情况下,您需要做的就是:

grep -v 'unwanted_word' file
a64a0gku

a64a0gku2#

我把这个问题理解为“我如何匹配一个单词但排除另一个单词”,对于这个问题,一个解决方案是两个连续的grep:第一个grep查找所需的“word1”,第二个grep排除“word2”:

grep "word1" | grep -v "word2"

在我的例子中:我需要区分“plot”和“#plot”,而grep的“word”选项不能做到这一点(“#”不是字母数字)。

kulphzqa

kulphzqa3#

如果您的grep支持Perl正则表达式,并且带有-P选项,则可以执行(如果bash;如果是tcsh,则需要转义!):

grep -P '(?!.*unwanted_word)keyword' file

演示:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

现在让我们列出除foo3之外的所有foo

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
6bc51xsx

6bc51xsx4#

正确的解决方案是使用grep -v "word" file及其等价的awk

awk '!/word/' file

但是,如果您碰巧遇到了一个更复杂的情况,比如说,您希望XXX出现而YYY * 不 * 出现,那么awk就很方便,而不必管道连接几个grep

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

你甚至可以说一些更复杂的话。例如:我希望这些行包含XXXYYY,但不包含ZZZ

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

等等。

xqnpmsa8

xqnpmsa85#

使用grep -v进行反向匹配:

grep -v "unwanted word" file pattern
9ceoxa92

9ceoxa926#

grep提供了“-v”或“--invert-match”选项来选择不匹配的行。
例如:

grep -v 'unwanted_pattern' file_name

这将输出文件file_name中没有'unwanted_pattern'的所有行。
如果要在一个文件夹内的多个文件中搜索模式,可以使用递归搜索选项,如下所示

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

这里grep将尝试列出当前目录中所有文件中出现的所有'wanted_pattern',并将其传递给第二个grep以过滤掉'unwanted_pattern'。|' - pipe将告诉shell将左边程序的标准输出(grep -r 'wanted_pattern' *)连接到右边程序的标准输入(grep -v 'unwanted_pattern ')。

xmd2e60i

xmd2e60i7#

-v选项将向您显示所有与模式不匹配的行。

grep -v ^unwanted_word
bf1o4zei

bf1o4zei8#

我使用grep -vw "^/"排除了根(“/”)挂载点。

# cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}'
/
/root/.m2
/root
/var

# cat /tmp/topfsfind.txt| head -4 |awk '{print $NF}' | grep -vw "^/"
/root/.m2
/root
/var
zynd9foi

zynd9foi9#

我有一个目录,里面有很多文件。我想找到所有不包含字符串“speedup”的文件,所以我成功地使用了下面的命令:

grep -iL speedup *

相关问题