使用grep正则表达式匹配任意数量的数字

33 浏览
0 Comments

使用grep正则表达式匹配任意数量的数字

我有一个文件,其中有类似以下的几行:

data
datalater
983290842
Data387428later
datafhj893724897290384later
4329804928later

我想使用正则表达式匹配以 \"data\" 开头,以 \"later\" 结尾并且中间有数字的任何行。目前我想到的是:

^[D,d]ata[0-9]*later$ 

但输出包括所有的 datalater 行。我可以使用管道,再使用 grep -v datalater,但我觉得一个表达式就足够了。

admin 更改状态以发布 2023年5月24日
0
0 Comments

使用Cygwin,以上命令不起作用。我必须修改上面给出的命令才能得到想要的结果。

$ cat > file.txt < data
> datalater
> 983290842
> Data387428later
> datafhj893724897290384later
> 4329804928later
> EOL

我总是喜欢确保我的文件包含我期望的内容:

$ cat file.txt
data
datalater
983290842
Data387428later
datafhj893724897290384later
4329804928later
$

我需要使用-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
$

0
0 Comments

使用+代替*

+匹配前面的字符至少一次或更多次。
*匹配零次或多次。

^[Dd]ata[0-9]+later$

在grep中,需要转义+,我们可以使用\d,它是一个字符类,用于匹配单个数字。

^[Dd]ata\d\+later$

在你的示例文件中,还有一行:

datafhj893724897290384later

由于数据和数字之间有字母,当前不会匹配。我们可以通过添加[^0-9]*来匹配数据之后直到数字。

最终命令如下:

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

0