Por que “o nível adicional de barras invertidas não é necessário no primeiro campo porque as barras invertidas não têm significado especial nos dados”?

0

Da linguagem de programação Awk

In a matching expression, a quoted string like "^[0-9]+$" can normally be used interchangeably with a regular expression enclosed in slashes, such as /^[0-9]+$/. There is one exception, however. If the string in quotes is to match a literal occurrence of a regular expression metacharacter, one extra backslash is needed to protect the protecting backslash itself. That is,

$0  ~ /(\+|-)[0-9]+/ 

and

$0  ~ "(\+|-)[0-9]+"

are equivalent.

This behavior may seem arcane, but it arises because one level of protecting backslashes is removed when a quoted string is parsed by awk. If a backslash is needed in front of a metacharacter to turn off its special meaning in a regular expression, then that backslash needs a preceding backslash to protect it in a string.

If the right operand of a matching operator is a variable or field variable, as in

X  ~ $1 

then the additional level of backslashes is not needed in the first field because backslashes have no special meaning in data.

O que a última frase significa?

Por que "o nível adicional de barras invertidas não é necessário no primeiro campo porque as barras invertidas não têm um significado especial nos dados"?

Obrigado.

    
por Tim 16.07.2017 / 19:14

1 resposta

1

O significado é data ao contrário de constantes , no sentido de que "abc" ou 88 ou /a|b/ aparecendo no programa awk é uma constante, mas uma variável awk contém dados ou $0 contém dados lidos da entrada. Os dados não são analisados, mas as constantes no corpo do texto do programa awk são.

Digamos que você queira corresponder a entrada x+y...z onde houver 1 ou mais y , então você precisa de um regexp, mas precisa escapar do + senão significa apenas 1 ou mais x ' s. Então você pode usar qualquer um dos seguintes:

awk 'BEGIN{ a = "x\+y+z"; print a }
     NR==1{ b = $0; print b; next }
     $0 ~ a            {print "match a " $0 }
     $0 ~ b            {print "match b " $0 }
     $0 ~ /x\+y+z/     {print "match 2 " $0 }
     $0 ~ "x\+y+z"    {print "match 3 " $0 }
' <<\!
x\+y+z
x+yyyyz
!

As últimas quatro linhas imprimem que combinam com a mesma coisa, por exemplo, x+yyyyz . O print a mostra a variável a , o valor dos dados é x\+y+z após a análise da constante, o print b mostra que a variável b do valor dos dados lidos não analisados da primeira linha de dados de entrada é a mesma, e a constante final de regexp e a constante de string são formas equivalentes.

    
por 16.07.2017 / 19:27