使用grep正则表达式匹配任意数量的数字
使用grep正则表达式匹配任意数量的数字
我有一个文件,其中有类似以下的几行:
data datalater 983290842 Data387428later datafhj893724897290384later 4329804928later
我想使用正则表达式匹配以 \"data\" 开头,以 \"later\" 结尾并且中间有数字的任何行。目前我想到的是:
^[D,d]ata[0-9]*later$
但输出包括所有的 datalater 行。我可以使用管道,再使用 grep -v datalater,但我觉得一个表达式就足够了。
admin 更改状态以发布 2023年5月24日
使用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 $