Leitura verbal de careta express dentro de colchetes, asterisco fora dos colchetes

1

Este é um acompanhamento da minha pergunta anterior " Sed para imprimir apenas a primeira correspondência de padrões da linha "

Os dados em que estou trabalhando

... "one" ... "two" ... "three" ...

Eu queria que one fosse impresso e a resposta que aceitei foi esta

sed 's/[^"]*"\([^"]*\)".*//'

Eu procurei e tentei entender essa expressão regular, mas não consegui dar a volta por cima dessa.

O que eu entendo é:

  • [^"] significa que não corresponde a "
  • * significa corresponder 0 qualquer número de caracteres precedido por *
  • \( e \) significa armazenar qualquer coisa correspondente entre eles para ser referenciada posteriormente pelo número correspondente, ou seja, no nosso caso, é apenas
  • .* é ganancioso e significa qualquer número de caracteres

Eu não entendo o que [^"]* aqui significa.

Como faço para ler verbalmente toda essa expressão regular para entender o que está acontecendo aqui

sed 's/[^"]*"\([^"]*\)".*//'
    
por GypsyCosmonaut 02.08.2017 / 23:57

2 respostas

2
NODE                     EXPLANATION
--------------------------------------------------------------------------------
  [^"]*                    any character except: '"' (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  \(                        group and capture to :
--------------------------------------------------------------------------------
    [^"]*                    any character except: '"' (0 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  \)                        end of 
--------------------------------------------------------------------------------
  "                        '"'
--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))

O segundo componente do comando sed chama para usar o que foi 'capturado' no parênteses. Deve-se observar que o comando sed inteiro não é uma expressão regular. Na construção s/needle/pin/g , a expressão regular é needle ou, se você gostar de suas expressões regulares "encapsuladas" (por exemplo, para uso em awk ), /needle/ .

    
por 03.08.2017 / 00:04
1

Como [^"]* significa "qualquer número de caracteres que não seja uma cotação", e como sed regex são gananciosos, [^"]* garante que a cotação a seguir seja a primeira cotação na sequência. A segunda regex similar garante que a cotação a seguir seja a segunda na sequência. .* corresponde ao que segue essa segunda citação.

Portanto, [^"]*"\([^"]*\)".* significa "corresponde à linha inteira e coloca o segundo campo delimitado por aspas em ".

    
por 03.08.2017 / 00:04

Tags