带有尾随空格的行开头的单词的正则表达式

时间:2015-07-25 16:14:21

标签: regex awk

我有以下一行:

    given some books I've given to my son.

注意“Given”前面的四个空格。我想在行的开头用正则表达式匹配“给定”后面的空格。我不希望第二个“给定”匹配。

如果我使用\s*given,它将匹配两个单词。如果我为行首(^)添加^\s*given,则它也不匹配。

尝试在此RegexOne example上输入\s*The^\s*The以了解问题。

修改

出于某种原因,fox示例现在正常工作,正则表达式在另一个站点上工作,所以这是我的完整示例:

  given an egg
    and some milk
    and the ingredient flour
   when the cook mangles everything to a dough
    and the cook fries the dough in a pan
   then the resulting meal is a pan cake

我的awk表达式都不匹配:

/^\s*given/ { print "given()."}
/^[\s]*and/ { print "and()."}
/^\s*when/ { print "when()."}
/^\s*then/ { print "then()."}

删除^后,它们都匹配。

2 个答案:

答案 0 :(得分:2)

正如Ed Morton所提到的,一些Awks(例如The One True Awk)仅支持POSIX字符类,因此\s与空格不匹配,它与字母s匹配。

由于您使用*来匹配零个或多个匹配项:

awk '/\s*given/' file

匹配,因为在行的开头没有出现s,而是:

awk '/^\s*given/' file

永远不会匹配,因为^(行首)和单词given之间存在不匹配的字符(空白)。

如果您使用+来匹配一个或更多次出现,您会发现这也不起作用:

awk '/\s+given/' file

所以显而易见的解决方案是使用[[:space:]]

awk '/^[[:space:]]*given/' file

但是,由于Awk的默认设置是按空格分割字段,如果您希望将单词与第一组非空白字符进行匹配,则可以更直接地将该字词与第一个字段$1进行比较。 / p>

awk '$1 == "given"' file

完全匹配,或者:

awk '$1 ~ /^given/' file

匹配第一个字段的开头。

顺便说一句,如果您想针对一组单词测试正则表达式并将其打印在().后面,如示例所示,您可以使用string functions {{1}和match这样:

substr

输出:

awk '{
    m = match($0, /^[[:space:]]*(given|and|when|then)/) # or match($1, /.../)
    if(m)
        print substr($1, RSTART, RSTART+RLENGTH) "()."
}' file

答案 1 :(得分:1)

这个正则表达式可以匹配您正在寻找的内容:

^[[:space:]]*given

它匹配前面的所有空白字符,包括第一个“给定”。

你可以在这里玩:

https://regex101.com/r/yA5dV0/1

编辑:将其改为Ed Morton的建议。