Extraindo string via grep regex assertions

0

Assuma uma string de texto my_string

$ my_string="foo bar=1ab baz=222;"

Gostaria de extrair a string alfanumérica entre a palavra-chave baz e o ponto e vírgula.

Como eu tenho que modificar o seguinte código grep usando asserções regex para também excluir o ponto e vírgula à direita?

$ echo $my_string | grep -oP '(?<='baz=').*'
222;
    
por Michael Gruenstaeudl 29.06.2017 / 16:12

4 respostas

3

A menos que a string que você queira extrair possa conter ; , o mais simples é provavelmente substituir . (que corresponde a qualquer caractere único) por [^;] (que corresponde a qualquer caractere excluindo ; )

$ printf '%s\n' "$my_string" | grep -oP '(?<='baz=')[^;]*'
222

Com grep vinculado à libpcre 7.2 ou mais recente, você também pode simplificar o lookbehind usando o formulário \K :

$ printf '%s\n' "$my_string" | grep -oP 'baz=\K[^;]*'
222

Eles imprimirão todas as ocorrências na string e presumirão que o texto correspondente não contém caracteres de nova linha (já que grep processa cada linha de entrada separadamente).

    
por 29.06.2017 / 16:21
1

A resposta da Steeldriver é precisa, mas eu tenho dificuldades com lookaheads / behinds e farei isso para facilitar a leitura (com bash ):

my_string="foo bar=1ab baz=222;"
regex='baz=([0-9]+);'
[[ $my_string =~ $regex ]] &&
  echo "${BASH_REMATCH[1]}"
    
por 29.06.2017 / 16:23
0

Também é fácil com sed :

sed -n 's/.*baz=\([^;]*\).*//p' <<< $my_string
222
    
por 29.06.2017 / 16:30
0

Com qualquer shell POSIX:

  • Para o texto entre a primeira ocorrência de baz= e a última ocorrência de ; depois disso:

    my_string="foo bar=1ab baz=222;"
    case $my_string in
      (*baz=*\;*)
        result=${my_string#*baz=}
        result=${result%;*};;
      (*) result=
    esac
    
  • para o texto entre a primeira ocorrência de baz= e a próxima ocorrência de ; , substitua % por %% acima

  • para a última ocorrência de baz= , substitua # por ## .

por 29.06.2017 / 16:37