我很困惑为什么这不匹配:
expr match Unauthenticated123 '^(Unauthenticated|Authenticated).*'
它输出 0。
答案1
你的命令应该是:
expr match Unauthenticated123 'Unauthenticated\|Authenticated'
如果你想要匹配的字符数。
要返回字符串的一部分(未经身份验证),请使用:
expr match Unauthenticated123 '\(Unauthenticated\|Authenticated\)'
从info coreutils 'expr invocation'
:
`字符串:正则表达式' 执行模式匹配。参数被转换为字符串 第二个被认为是(基本的,GNU `grep') 正则表达式,隐式前置“^”。首先 然后将参数与该正则表达式进行匹配。 如果匹配成功并且 REGEX 使用“\(”和“\)”,则“:” 表达式返回 STRING 中与 子表达式;否则,返回字符数 匹配。 如果匹配失败,则“:”运算符返回空字符串 if REGEX 中使用“\(”和“\)”,否则为 0。 只有第一个“\( ... \)”对与返回值相关; 附加对仅对常规分组有意义 表达式运算符。 在正则表达式中,“\+”、“\?”和“\|”是运营商 分别匹配一个或多个、零个或一个、或单独的 备择方案。 SunOS 和其他“expr”将它们视为常规的 人物。 (POSIX 允许这两种行为。) *注意正则 表达式库:(regex)Top,了解正则表达式的详细信息 句法。 *note 中的一些示例是 expr:: 的示例。
答案2
请注意, 和match
都是GNU 扩展(并且当模式以 开头时(标准等效项)\|
的行为因实现而异)。标准情况下,你会这样做::
match
^
expr " $string" : " Authenticated" '|' " $string" : " Unauthenticated"
前导空格是为了避免以or are运算$string
符开头的值出现问题,但这意味着它会在匹配的字符数上加一。-
expr
使用 GNU expr
,你可以这样写:
expr + "$string" : 'Authenticated\|Unauthenticated'
+
即使它碰巧是一个运算符,也必须将其视为$string
字符串expr
。expr
正则表达式是基本的正则表达式,没有交替运算符(where 也不|
特殊)。 GNU 实现将其视为\|
扩展。
如果您只想检查是否以or$string
开头,您最好使用:Authenticated
Unauthenticated
case $string in
(Authenticated* | Unauthenticated*) do-something
esac
答案3
$ expr match "Unauthenticated123" '^\(Unauthenticated\|Authenticated\).*'
你必须用\
括号和管道来转义。