使用grep中的星座

时间:2009-07-01 14:06:58

标签: regex bash grep

我正在尝试在linux / bash

中的特定文件中搜索子字符串“abc”

所以我这样做:

grep '*abc*' myFile

它什么都不返回。

但如果我这样做:

grep 'abc' myFile

正确返回匹配。

现在,这对我来说不是问题。但是,如果我想要更复杂的字符串,请说

*abc * def *

如何使用grep完成它?

10 个答案:

答案 0 :(得分:101)

星号只是repetition operator,但您需要告诉它重复的内容。 /*abc*/匹配一个包含ab和零个或多个c的字符串(因为第二个*在c上;第一个没有意义,因为它没有重复的内容)。如果你想匹配任何东西,你需要说.* - 点表示任何字符(within certain guidelines)。如果你只想匹配abc,你可以说grep 'abc' myFile。对于更复杂的匹配,您需要使用.* - grep 'abc.*def' myFile将匹配包含abc的字符串,后跟def,其中包含可选的内容。

根据评论进行更新:

正则表达式中的

*与控制台中的*不完全相同。在控制台中,*是glob construct的一部分,只是充当通配符(例如ls *.log将列出以.log结尾的所有文件)。但是,在正则表达式中,*是一个修饰符,这意味着它只适用于它前面的字符或组。如果您希望正则表达式中的*充当通配符,则需要使用前面提到的.* - 点是通配符,修改点时星号表示找到一个或多个点;即。找到一个或多个角色。

答案 1 :(得分:14)

点字符表示匹配任何字符,因此.*表示任何字符出现零次或多次。您可能意味着使用.*而不仅仅是*

答案 2 :(得分:11)

“星座”只有在它前面有东西时才有意义。如果没有工具(在这种情况下为grep)可能只是将其视为错误。例如:

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz

答案 3 :(得分:5)

您尝试过的表达式,例如在Linux中的shell命令行上运行的表达式,称为“glob”。 Glob表达式未满regular expressions,这是grep用于指定要查找的字符串的内容。 Here(旧的,小的)关于差异的帖子。 glob表达式(如“ls *”中)由shell本身解释。

可以从全球转换为RE,但您通常需要在脑海中进行转换。

答案 4 :(得分:4)

你没有使用正则表达式,所以你选择的grep变体应该是fgrep,它的行为与你期望的一样。

答案 5 :(得分:3)

尝试使用grep -E进行扩展正则表达式支持

另请看一下:

The grep man page

答案 6 :(得分:3)

使用grep -P - 支持Perl样式的正则表达式。

grep -P "abc.*def" myfile

答案 7 :(得分:1)

这可能是您正在寻找的答案:

grep abc MyFile | grep def

唯一的事情是......它的输出线是" def"在" abc"

之前或之后

答案 8 :(得分:0)

'*'用作前一项的修饰符。因此'abc * def'搜索'ab',然后搜索0或更多'c',然后搜索'def'。

你可能想要的是'abc。* def',它搜索'abc'后跟任意数量的字符,后跟'def'。

答案 9 :(得分:0)

这对我有用:

grep“。* $ {expr}”-用双引号引起来,在点号之前是标准grep,没有附加开关。