grep不允许我写`[:alpha:]`而不是其他工具d

2024-03-28 20:42:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个正则表达式字符类,它只匹配只包含以下一个或多个字符的字符串,而不包含任何其他字符。在

  • :
  • a
  • l
  • p
  • h。在

当然,我可以做一些简单的事情,这样就行了。在

$ printf "foo\nhal\npal\na:h\n" | grep '^[:alph]*$'
hal
pal
a:h

但是如果我尝试这样做,比如在character类中使用冗余字符,我会得到一个错误。在

^{pr2}$

现在,我知道怎么回事了。grep“相信”我错写了{},而我的意思是{}。在

但是[:alpha:]不是POSIX中有效的正则表达式吗?它真的应该为有效的正则表达式抛出错误吗?它不应该警告我我可能是指[[:alpha:]]?在

事实上,如果我在正则表达式中使用[:alpha:],那么sed一点也不抱怨。它的行为与[:alph]完全相同。我相信sed做得对。在

$ printf "foo\nhal\npal\na:h\n" | sed -n '/^[:alpha]*$/p'
hal
pal
a:h

Python也做了正确的事情。在

>>> import re
>>> re.search('^[:alpha:]*$', 'foo')
>>> re.search('^[:alpha:]*$', 'hal')
<_sre.SRE_Match object at 0x7f33d4060f38>
>>> re.search('^[:alpha:]*$', 'pal')
<_sre.SRE_Match object at 0x7f33d4060920>
>>> re.search('^[:alpha:]*$', 'a:h')
<_sre.SRE_Match object at 0x7f33d4060f38>

只有grep才想聪明点,告诉我我不是说[:alpha:],而是说[[:alpha:]]。在

POSIX的标准是什么?它允许正则表达式引擎为[:alpha:]抛出错误,还是要求引擎将[:alpha:]视为{}?在

如果能逐字引用POSIX标准的相关摘录及其URL,我会认为我的问题得到了回答。在


Tags: alpharesearchobjectfoomatch错误字符
1条回答
网友
1楼 · 发布于 2024-03-28 20:42:58

你说得很对,“grep[试图]聪明一点,告诉我我不是说[:alpha:],而是说[[:alpha:]]”,我个人认为这不是一件非常糟糕的事情——如果grep在一个表达式中看到{},我认为写它的人更可能是在犯错误,而不是真正的意思是什么是严格写的。在

你也对,这种(可以说是有帮助的)行为没有conform to POSIX。不过,我注意到,GNU grep受环境变量POSIXLY_CORRECT的影响,该变量改变其行为,使其符合POSIX。还有一个note on the man page,上面写着:

If you mistakenly omit the outer brackets, and search for say, ‘[:upper:]’, GNU grep prints a diagnostic and exits with status 2, on the assumption that you did not intend to search for the nominally equivalent regular expression: ‘[:epru]’. Set the POSIXLY_CORRECT environment variable to disable this feature.

比较:

$ printf "foo\nhal\npal\na:h\n" | grep '^[:alpha:]*$'
grep: character class syntax is [[:space:]], not [:space:]

有。在

^{pr2}$

因此,如果你真的不想这样做的话,你似乎可以关掉这种“有益”的行为。在

相关问题 更多 >