使用grep regex匹配任意数量的数字

使用grep regex匹配任意数量的数字,regex,grep,Regex,Grep,我有一个文件,其中的行看起来很像,如下所示 数据 datalater 983290842 数据387428更新 DataFHJ893724897290384更高版本 4329804928之后 我想做的是使用正则表达式匹配任何以数据开头、以后面结尾、中间有数字的行。以下是我迄今为止炮制的: ^[D,D]ata[0-9]*更高版本$ 但是,输出包括所有稍后的数据行。我想我以后可以通过管道传输输出和grep-v数据,但我觉得一个表达式就可以了。使用+而不是* +至少与前面的一个或多个匹配。 *匹配

我有一个文件,其中的行看起来很像,如下所示

数据
datalater
983290842
数据387428更新
DataFHJ893724897290384更高版本
4329804928之后
我想做的是使用正则表达式匹配任何以数据开头、以后面结尾、中间有数字的行。以下是我迄今为止炮制的:

^[D,D]ata[0-9]*更高版本$

但是,输出包括所有稍后的数据行。我想我以后可以通过管道传输输出和grep-v数据,但我觉得一个表达式就可以了。

使用
+
而不是
*

+
至少与前面的一个或多个匹配。
*
匹配零个或多个

^[Dd]ata[0-9]+later$
在grep中,您需要转义
+
,我们可以使用
\d
,这是一个字符类,匹配单个数字

^[Dd]ata\d\+later$
在示例文件中,还有一行:

datafhj893724897290384later
由于数据和数字之间存在字母,因此当前不匹配。我们可以通过添加一个
[^0-9]*
来匹配数据后面的任何内容,直到数字

我们的最后命令是:

grep '^[Dd]ata[^0-9]*\d\+later$' filename

您应该用“+”(表示一个或多个)代替“*”(表示零、一个或多个

您正在用*限定符匹配零个或多个数字。请尝试

^[Dd]ata\d+later$

相反。您还在字符串的开头找到逗号(例如“、ata1234later”)。并且\d是查找任何数字字符的快捷方式。因此我也更改了这些字符。

使用Cygwin,上述命令无效。我必须修改上面给出的命令以获得所需的结果

$ cat > file.txt <<EOL
> data
> datalater
> 983290842
> Data387428later
> datafhj893724897290384later
> 4329804928later
> EOL
我需要使用
-p
标志运行Perl风格的表达式。这意味着我不能使用
[^0-9]+
,它的必要性@Tom_Cammann恰当地指出了这一点。相反,我使用了
*
,它匹配与模式下一部分不匹配的任何字符序列。下面是我的命令和输出

$ grep -P '^[Dd]ata.*\d+later$' file.txt
Data387428later
datafhj893724897290384later

$
我希望能够更好地解释为什么需要Perl表达式,但我只知道Cygwin的
grep
的工作方式有点不同

系统信息

$ uname -a
CYGWIN_NT-10.0 A-1052207 2.5.2(0.297/5/3) 2016-06-23 14:29 x86_64 Cygwin
我以前回答的结果

$ grep '^[Dd]ata[^0-9]*\d\+later$' file2.txt

$ grep '^[Dd]ata\d+later$' file2.txt

$ grep -P '^[Dd]ata[^0-9]*\d\+later$' file2.txt

$ grep -P '^[Dd]ata\d+later$' file2.txt
Data387428later

$
“+”语法仅适用于扩展regexp,而不适用于标准grep。
至少,这是我在RHEL的经验

要使用扩展regexp,请运行egrep或pass“-E”/--extended regexp 例子

标准grep

带-E的grep


HTH

oOps,Tom在我写答案时回答了几个问题,他明白了!当使用这个表达式或@Eric时,我在输出上没有得到任何结果。我使用的是:grep^[D,D]ata[0-9]+稍后$filenames,即使是作为复制/粘贴,也无法使用它。文件内容也要有空格/换行符
$cat test2 datadata datalater data98349248later datadhsd90834092823later
如果有空格,您可以更新问题中的示例文件,以便我可以更新正则表达式。它目前适用于示例yo你已经提供了。我希望这会显示输出,但不会产生任何结果。请看我对@tom的响应。虽然我使用的是MinGW,但你的回答也帮助了我。根据git bash的说法,“这取决于MSYS DLL,它是Cygwin DLL的一个分支”,这将解释一切
$ grep '^[Dd]ata[^0-9]*\d\+later$' file2.txt

$ grep '^[Dd]ata\d+later$' file2.txt

$ grep -P '^[Dd]ata[^0-9]*\d\+later$' file2.txt

$ grep -P '^[Dd]ata\d+later$' file2.txt
Data387428later

$
echo abc123n1  | grep "abc[0-9]+n1"
<no output>
echo abc123n1  | egrep "abc[0-9]+n1"
abc123n1
echo abc123n1  | grep -E "abc[0-9]+n1"
abc123n1