![expr 匹配中转义括号背后的意义](https://linux22.com/image/78436/expr%20%E5%8C%B9%E9%85%8D%E4%B8%AD%E8%BD%AC%E4%B9%89%E6%8B%AC%E5%8F%B7%E8%83%8C%E5%90%8E%E7%9A%84%E6%84%8F%E4%B9%89.png)
任何人都可以告诉我以下两个命令在转义括号的情况下的区别,或者参考一些可以消除我疑问的文档。
string=abcABC123ABCabc
$ echo `expr match "$string" 'abc[A-Z]*.2'` #Result is 8, the count of matched characters
$ echo `expr match "$string" '\(abc[A-Z]*.2\)'` #Result is abcABC12, the matched characters
这里转义括号的实际意义是什么\(...\)
?
答案1
指的是GNUexpr
(coreutils 的一部分)和\(
和\)
正在标记团体如记载于16.4.1 字符串表达式:
如果匹配成功并且正则表达式使用
‘\(’
and‘\)’
,则 : 表达式返回字符串中与子表达式匹配的部分;否则,返回匹配的字符数。
文档参考了3 正则表达式了解grep
详细信息。这句法正则表达式的个数是记录在案在 POSIX 中:
与整个匹配是最左边匹配中最长的匹配一致,每个子模式从左到右应匹配最长的可能字符串。为此,空字符串应被视为比根本没有匹配项更长。例如,将 BRE
"\(.*\).*"
与匹配"abcdef"
,子表达式"(\1)"
为“abcdef”,将 BRE"\(a*\)*"
与“bc”匹配,子表达式"(\1)"
为空字符串。
POSIXexpr
提到了带有运算符的正则表达式:
:
expr1 : expr2
但接着说:
字符串参数的使用
length
,子字符串,指数, 或者match
产生未指定的结果。
所以这个特殊的用法似乎是一个扩展。
的 POSIX 用法:
详细记录在 参考资料 部分匹配表达式;这匹配此处看到的运算符对应于:
,但其位置更改为字首:
POSIX使用的运算符(两个运算符之前)中缀(两个操作数之间)。
作为一个群体来看,长度等,可以被视为扩大(提供无法通过特定实用程序实现的功能的非标准功能)或仅仅是非标准(执行可以通过不同方法完成的功能的不兼容方式)。这个是混合的:POSIX shell 提供了类似的功能长度等,如有关部分所述参数替换, IE,${#parameter}
。然而子字符串和指数没有明显的完全等价物。 (尽管语法不同,但整个组可能基于awk
)。
答案2
当模式包含子表达式时\(...\)
,将返回匹配的字符串。这种行为是由 POSIX 指定:
或者,如果模式包含至少一个正则表达式子表达式“[\(...\)]”,则应返回与反向引用表达式“\1”匹配的字符串。如果反向引用表达式“\1”不匹配,则应返回空字符串。
请注意,您应该将命令更改为:
expr "$string" : '\(abc[A-Z]*.2\)'
使其在所有 POSIX 兼容的环境中工作expr
。的用途match
未指定。
答案3
反斜杠括号\(...\)
创建“捕获组”。expr match
似乎返回第一个捕获组。