gpt4 book ai didi

regex - 任何年份的简单 grep

转载 作者:可可西里 更新时间:2023-11-01 11:43:38 26 4
gpt4 key购买 nike

我知道我在这里做了一些愚蠢的事情,但是在我的 Unix/Linux 类(class)中给我们的正则表达式备忘单暗示(根据我的阅读)这应该在文本文件中找到包含年份(数字从 0000 到9999):

grep \d{4} file.txt

为什么它什么也没找到?这是使用 bash,与 Windows 上的 PuTTY 和 Mac 上的终端中的结果相同。我试过带有括号和引号的变体,但没有效果。搜索 [0-9][0-9][0-9][0-9] 有效,但没有 \d{4} 似乎按照我的预期运行。

在相关说明中,为什么 .\+ 具有我期望 .+ 具有的效果,而 .+ 只是普通的“不起作用”? (我知道它告诉 grep 去寻找 something 但我不知道是什么。)也就是说,这似乎是要求“这里的一个或多个字符”而不是“一个字符”的方式其次是加号”。 (这是做作业的正确方法,老师可以向我解释为什么会这样)以及如何搜索“一个字符后跟加号”?

最佳答案

您的备忘单可能声明 \d{4} 是一个有效的正则表达式,意思是“四位数字”;它可能会声明 grep 在文件中搜索正则表达式。分开来看,这两种说法都是正确的。但综合起来,它们具有很强的误导性,因为 grep PATTERN FILE 需要一种正则表达式(POSIX“基本正则表达式”,BRE),而 \d{4} 是来自不同类型的正则表达式(有时称为“Perl 兼容正则表达式”,PCRE,以 Perl 编程语言命名)的符号。

grep 的许多版本都支持 -P 标志来指示该模式是 PCRE 而不是 BRE;你可以试试:

grep -P '\d{4}' file.txt

(注意 \d{4} 周围的单引号。这些是必要的,否则 Bash 会将 \d 作为 的一种简写'd',因此传递给 grep 的实际模式将是 d{4},意思是“四个 d”而不是“四位数字”。或者,您可以编写 grep -P\\d{4} file.txt,它以不同的方式解决了相同的问题。)


编辑添加:抱歉,我未能涵盖您问题的第二部分,关于 +。所以,根据相关规范,1 这个:

grep .+ file.txt

使用 . 表示“除 NUL 之外的任何字符”,使用 + 表示“实际的加号”。所以它确实应该打印包含非初始加号的 file.txt 行;如果您看到不同的行为,那么您的 shell 和/或 grep 一定是不合格的。

此外,这:

grep .\+ file.txt

和上面一样,因为一个符合 POSIX 规范的 shell(比如 Bash)会把 \+ 当作一种奇特的写法 +,所以 grep 将看到与以前相同的参数。 (grep 将无法知道您键入的是 .\+ 而不是 .+。)

最后,这个:

grep '.\+' file.txt

(其中 \ 实际上传递给 grep)具有未定义的行为:给定的 grep 实现可以将其视为相同的意思.+,或者它可以将 \+ 当作一个特殊的符号,意思是“一个或多个”(或其他),或者它可以给出错误消息。 GNU 实现恰好采用“一个或多个”解释,但其他人可能有所不同。

脚注:

  1. the grep spec , 和 the BRE and ERE spec (grep 规范链接并引用)。同样相关的是 the shell spec ,因为它是 shell 决定传递给 grep 的实际参数。

关于regex - 任何年份的简单 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16599202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com