grep在两个空格之间找到字母

时间:2016-12-07 10:13:53

标签: bash

我必须找到话语。

在我的作业中,一个单词被定义为两个空格之间的字母(“bla”)。我必须找到像this这样的decimalIntegerConstant,但它必须是一个单词。

我用

 grep -E -o " (0|[1-9]+[0-9]*)([Ll]?) "

但它不起作用,例如:

  

bla 0l labl 2 3 abla0La0LSfdgpočítačsd

输出

0l
2 
0L 

但缺少3

1 个答案:

答案 0 :(得分:1)

匹配不重叠。你的正则表达式匹配22消失后的空白。它不会被考虑用于进一步的比赛。

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