significância por trás de parênteses de escape em expr match

0

Alguém pode me dar a diferença entre os dois comandos a seguir no contexto de escape de parênteses, ou indicar algum documento que elimine minha dúvida.

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

Qual é o significado real dos parênteses com escape \(...\) aqui?

    
por Sudhish Vln 30.11.2015 / 09:44

3 respostas

4

Isso se refere ao GNU expr (parte do coreutils) e os \( e \) estão marcando um grupo como documentado em 16.4.1 Expressões de string :

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.

A documentação refere-se a 3 expressões regulares em grep para detalhes. A sintaxe de expressões regulares é documentada em POSIX:

Consistent with the whole match being the longest of the leftmost matches, each subpattern, from left to right, shall match the longest possible string. For this purpose, a null string shall be considered to be longer than no match at all. For example, matching the BRE "\(.*\).*" against "abcdef", the subexpression "()" is "abcdef", and matching the BRE "\(a*\)*" against "bc", the subexpression "()" is the null string.

POSIX expr menciona expressões regulares com o operador : :

expr1 : expr2

mas continua dizendo:

The use of string arguments length, substr, index, or match produces unspecified results.

para que esse uso específico pareça ser uma extensão.

O uso POSIX de : está documentado em detalhes na seção Expressão correspondente ; o operador match visto aqui corresponde ao : , mas a sua posição é alterada para um operador prefixo (antes dos dois operadores) onde POSIX : usa infix (entre os dois operandos).

Visto como um grupo, o comprimento , etc., pode ser considerado como uma extensão (um recurso não padrão que fornece funcionalidade não alcançável através de uma determinada utilidade) ou meramente não padrão (uma maneira incompatível de executar uma função que pode ser feita através de um método diferente). Este é um misto: o shell POSIX fornece uma funcionalidade semelhante para length , etc., conforme documentado na seção Substituição de parâmetros , ou seja, ${#parameter} . No entanto, substr e índice não têm equivalente exato aparente. (Embora a sintaxe difere, o grupo inteiro é provavelmente baseado em awk ).

    
por 30.11.2015 / 10:16
2

Quando o padrão contiver a subexpressão \(...\) , a string correspondida será retornada. Esse comportamento é especificado por POSIX :

Alternatively, if the pattern contains at least one regular expression subexpression "[\(...\)]", the string matched by the back-reference expression "" shall be returned. If the back-reference expression "" does not match, then the null string shall be returned.

Note que você deve alterar o comando para:

expr "$string" : '\(abc[A-Z]*.2\)'

para que funcione em todos os expr compatíveis com POSIX. O uso de match não é especificado.

    
por 30.11.2015 / 10:17
0

Parênteses invertidos \(...\) criam um "grupo de captura". expr match parece retornar o primeiro grupo de captura.

    
por 30.11.2015 / 10:15