这是我得到的:
grep -E '^([0-9]+[0-9]*[.]+[:blank:]+[a-zA-Z0-9]+)' text.txt
我正在尝试查找所有包含一个或多个数字后跟“。”的匹配项。 dot,atlas one space,后面跟着至少一个字符或数字。所以,一些可能的匹配将是,
1. hello
2. this works too
5. Fantastic show
12. Target
我得到了什么错。
答案 0 :(得分:0)
关于有效性,有两件事:
[:blank:]
是一个字符类。要在范围内使用它,您必须使用[ ]
进行包装,如下所示:[[:blank:]]
您的上一个范围表达式不包含空格,因此您只匹配第一个单词
修正,看起来像:
$ grep -E '^([0-9]+[0-9]*[.]+[[:blank:]]+[a-zA-Z0-9 ]+)' text.txt
1. hello
2. this works too
5. Fantastic show
12. Target
否则,正如其他人暗示的那样,你的表达可以简化。如果您需要坚持使用POSIX扩展正则表达式(ERE),请注意[0-9]+[0-9]*
等同于[0-9]+
。
如果您可以启用PCRE支持(-P
,仅在GNU grep
中可用,被视为实验功能),则可以简化使用的字符范围。例如,您可以使用\d
代替POSIX [[:digit:]]
(或[0-9]
)和\w
代替[[:alnum:]]
(或[a-zA-Z0-9]
):< / p>
$ grep -P '^\d+\.+\s+[\w ]+' text.txt
答案 1 :(得分:0)
在数字后匹配表达式中不包含空格:
[a-zA-Z0-9]+
。
您还可以简化表达。
[0-9]+[0-9]*
应为[0-9]+
,或更简单\d+
。您的原始表达意味着“匹配一个或多个数字,然后匹配零个或多个数字”。一个或多个已处理您的预期输入。
[.]+
- 您是否期望超过一个时期?如果没有,您只需要[.]
鉴于此,我将你的表达改为:
^([0-9]+[.][[:blank:]]+[a-zA-Z0-9 ]+)
(感谢@randomir编辑posix [[:blank:]]
。