我有以下一行:
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()."}
删除^
后,它们都匹配。
答案 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的建议。