Grep 搞乱了我的理解

发布于 2024-12-05 14:10:32 字数 252 浏览 1 评论 0原文

一段时间以来,我一直在尝试使用 grep 从文件中检索数据,我注意到一些有趣的事情。

这可能是我的无知,但这就是发生的事情......

假设我有一个文件 ABC。数据是:

a
abc
ab
bac
bb
ac

现在运行这个 grep 命令,

grep a* ABC

我发现输出包含以 bc 开头的行,为什么会发生这种情况?

For sometime I have been trying to play with grep to retrieve data from files and I noticed something funny.

It might be my ignorance but here is what happens...

Suppose I have a file ABC. the data is:

a
abc
ab
bac
bb
ac

Now ran this grep command,

grep a* ABC

I found the output to contain lines starting a with b.c. why is this happening?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

孤君无依 2024-12-12 14:10:32

您使用“a*”作为搜索模式...“*”表示零个或多个前一个字符,因此“bc”匹配,其中包含零个或多个“a”。

在半相关的说明中,我建议引用“a*”位,因为如果当前子目录中有任何以 a 开头的文件,您会非常惊讶地看到您真正要搜索的内容,因为 shell(bash、zsh、csh、sh、dash、wtfsh...)将在执行命令之前自动执行通配符扩展。

如果您想搜索以“a”开头的行,那么您需要使用前导 ^ 字符来锚定搜索模式,这样您的模式就会变成“^a*”,但同样,* 表示零或更多,所以在这种只有一个字母的情况下它没有用...使用 '^a' 代替。

作为一个人为的示例,如果您想查找包含“c”和包含字母“bc”的所有行,那么您可以使用“b*c”作为搜索模式...意味着零个或多个 b,并且a c.

正则表达式搜索模式的力量是巨大的,并且需要一些时间来理解。仔细阅读 grep(1)、regex(7)、pcre(3)、pcresyntax(3)、pcrepattern(3) 的手册页。

一旦你掌握了它们的窍门,正则表达式在 sed、grep、perl、vim(可能还​​有 emacs)中很有用,...呃,已经晚了(早?) 没有更多的想法,但它们非常强大。

作为一些奖励,“*”表示零个或多个,“+”表示一个或多个,“?”表示表示“零”或“一”。

因此,要搜索具有两个或多个 a 的内容...“aa+”,即 1 个 a 和 1+ a(1 个或更多),

我会漫步...(正则表达式(7)!)

You used 'a*' as your search pattern... the '*' means ZERO or MORE of the previous character, so 'b.c' matches, having ZERO or more 'a's in it.

On a semi-related note, I'd recommend quoting the 'a*' bit, since if you have ANY files in the current subdirectory which start with a, you'll be VERY surprised to see what you're really searching for, since the shell (bash,zsh,csh,sh,dash,wtfsh...) will perform wildcard expansion automatically BEFORE the command is executed.

if you want to search for lines which START with 'a', then you'll need to anchor the search pattern with a leading ^ character, so your pattern becomes '^a*', but again, the * means ZERO or more, so it's not useful in this situation where you only have one letter... use '^a' instead.

As a contrived example, if you wanted to find all the lines containing a 'c' AND those containing the letters 'bc', then you could use 'b*c' as the search pattern... meaning ZERO or more b's, and a c.

The power of the regex search pattern is immense, and takes some time to grok. Peruse the man pages for grep(1), regex(7), pcre(3), pcresyntax(3), pcrepattern(3).

Once you get the hang of them, regex's are useful in sed, grep, perl, vim, (probably emacs too), ... uh, it's late (early?) nothing more comes to mind, but they're VERY powerful.

As some bonus, '*' means ZERO or more, '+' means ONE or more, and '?' means ZERO or ONE.

So to search for things with two or more a's... 'aa+', which is 1 a, and 1+ a (1 or more)

I ramble.... (regex(7)!)

め可乐爱微笑 2024-12-12 14:10:32

grep 尝试在整行中找到该模式。使用 ^a 获取以 a 开头的行,或使用 ^a*$ 查找仅包含 a 的行(包括空行)。

另外,如果您使用 a* 并且工作目录中有一个以 < 开头的文件,请引用该 shell 参数(例如:'^a*$') code>a 你会得到非常奇怪的结果......

grep tries to find that pattern in the whole line. Use ^a to get line starting with a or ^a*$ to find lines containing only as (including the empty line).

also, please quote that shell argument (eg: '^a*$'), if you use a* and there is a file in the working directory starting with an a you will get very weird results...

我为君王 2024-12-12 14:10:32

试试这个,它对我有用。 ^ 表示行的开头 - 因此它必须以 a 开头。

grep ^a ABC

Try this, it works for me. The ^ means beginning of a line - so it has to start with a.

grep ^a ABC
神魇的王 2024-12-12 14:10:32

您需要在模式周围加上引号:

grep "a*" ABC

否则 * 由 shell(执行通配符文件名匹配)解释,而不是由 grep 本身解释。

You need to put quotes around your pattern:

grep "a*" ABC

Otherwise the * is interpreted by the shell (which does wild-card filename matching), instead of by grep itself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文