stackoverflow中有一个类似的问题,但它不适用于 bash。
需要什么才能使其与 bash 一起使用,与脚本/变量一起使用?
我说的是 ISO 639-1 或 ISO 639-2 代码。
我的 bash 是 GNU 4.3。
例子:
root@box ~/test2 # ls
eng en-US por pt-BR
该页面中的正则表达式失败:
root@box ~/test2 # ls | grep ^[a-z]{2}-[A-Z]{2}$
root@box ~/test2 # ls | grep ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep ^[a-z]{2}(-[A-Z]{2})*
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep "^[a-z]{2}(-[A-Z]{2})*"
{n}
没有反斜杠是扩展正则表达式的一部分,因此您需要-E
grep 的标志。此外,您想引用正则表达式,因为如您所见,括号和大括号对 shell 具有特殊含义。或者只使用 Bash:
(
[[ .. ]]
测试构造很特殊,大括号和圆括号在其中有不同的含义,实际上这里的正则表达式必须不加引号。请注意,这与 完全不同[ .. ]
。参见例如BashGuide on conditionals)该
[a-zA-Z]{1,8}
部分匹配最多八个字母的字符串,最后*
允许括号中组的任意重复次数,所以这也匹配类似的东西foobar-foobar-foobar
。我们可以将模式更改为
^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,3})?$
仅允许包含两个或三个字母和一个尾随-xx
部分的代码,如果这就是您所需要的。未引用
{1,8}
的是大括号扩展:并且未引用
[]
的是文件名模式匹配(glob) ...首先,您需要
regex
根据 grep 要求引用使用grep 'regex'
然后,您将在 grep 中使用扩展的正则表达式支持,
egrep
或者grep -E
,这将正常工作:或者您可以使用经典的 grep - 基本正则表达式,但您需要转义
{
并且}
:根据您的问题,对于这些数据
两种 grep 情况下的输出将是
-E
grep -E "^[a-z]{2}-[A-Z]{2}$"