我必须找到话语。
在我的作业中,一个单词被定义为两个空格之间的字母(“bla”)。我必须找到像this这样的decimalIntegerConstant,但它必须是一个单词。
我用
grep -E -o " (0|[1-9]+[0-9]*)([Ll]?) "
但它不起作用,例如:
bla 0l labl 2 3 abla0La0LSfdgpočítačsd
输出
0l
2
0L
但缺少3
。
答案 0 :(得分:1)
匹配不重叠。你的正则表达式匹配2
。 2
消失后的空白。它不会被考虑用于进一步的比赛。
POSIX grep
无法在一个步骤中执行您想要的操作,但您可以分两个阶段执行此类操作(从正则表达式中简化,不支持[lL]
)
grep -o ' [0-9 ]* ' | grep -E -o '[0-9]+'
即,将一系列以空格分隔的数字与前导和尾随空格匹配,并从中匹配单个数字而不考虑空格。根据您的需要,简化数字的定义。
Perl兼容的正则表达式有一种方法可以匹配东西,而不会消耗它,例如,如评论中所述:
grep -oP " (0|[1-9]+[0-9]*)[Ll]?(?= )"
(?= )
是前瞻断言,这意味着grep
将在输入流中向前看,并确保匹配后跟一个空格。该空间不会被视为比赛的一部分,也不会被消耗。如果找不到空格,则匹配失败。
不保证PCRE可以在grep
的所有实现中使用。
编辑:Posix未指定-o
。