OU dans `expr match`

Je suis confus quant à pourquoi cela ne correspond pas:

expr match Unauthenticated123 '^(Unauthenticated|Authenticated).*'

il sort 0.

Votre command devrait être:

 expr match Unauthenticated123 'Unauthenticated\|Authenticated' 

Si vous voulez le nombre de caractères appariés.

Pour utiliser la partie de la string (Unauthenticated) renvoyée:

 expr match Unauthenticated123 '\(Unauthenticated\|Authenticated\)' 

De info coreutils 'expr invocation' :

STRING : REGEX' Perform pattern matching. The arguments are converted to ssortingngs and the second is considered to be a (basic, a la GNU STRING : REGEX' Perform pattern matching. The arguments are converted to ssortingngs and the second is considered to be a (basic, a la GNU expression régulière STRING : REGEX' Perform pattern matching. The arguments are converted to ssortingngs and the second is considered to be a (basic, a la GNU grep '), avec un `^' implicitement préfixé. Le premier argument est ensuite comparé à cette expression régulière.

  If the match succeeds and REGEX uses `\(' and `\)', the `:' expression returns the part of STRING that matched the subexpression; otherwise, it returns the number of characters matched. If the match fails, the `:' operator returns the null ssortingng if `\(' and `\)' are used in REGEX, otherwise 0. Only the first `\( ... \)' pair is relevant to the return value; additional pairs are meaningful only for grouping the regular expression operators. In the regular expression, `\+', `\?', and `\|' are operators which respectively match one or more, zero or one, or separate alternatives. SunOS and other `expr''s treat these as regular characters. (POSIX allows either behavior.) *Note Regular Expression Library: (regex)Top, for details of regular expression syntax. Some examples are in *note Examples of expr::. 

Notez que les deux match et \| sont des extensions GNU (et le comportement de : (l'équivalent standard de la correspondance) lorsque le model commence par ^ varie avec les implémentations). En règle générale, vous feriez:

 expr " $ssortingng" : " Authenticated" '|' " $ssortingng" : " Unauthenticated" 

L'espace principal est d'éviter les problèmes avec les valeurs de $ssortingng qui commencent par - ou sont des opérateurs expr , mais cela signifie qu'il ajoute un au nombre de caractères appariés.

Avec GNU expr , vous l'écririez:

 expr + "$ssortingng" : 'Authenticated\|Unauthenticated' 

Le + force $ssortingng à prendre comme une string même s'il se trouve être un opérateur expr . expr expressions régulières sont des expressions régulières de base qui n'ont pas d'opérateur d'alternance (et où | n'est pas spécial). L'implémentation GNU l'a comme \| bien que comme une extension.

Si vous voulez simplement vérifier si $ssortingng commence par Authenticated ou Unauthenticated , mieux vaut utiliser:

 case $ssortingng in (Authenticated* | Unauthenticated*) do-something esac 

$ expr match "Unauthenticated123" '^\(Unauthenticated\|Authenticated\).*' vous devez vous échapper avec \ la parenthèse et le pipe.