AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 421460
Accepted
rjm61
rjm61
Asked: 2018-02-03 07:19:12 +0800 CST2018-02-03 07:19:12 +0800 CST 2018-02-03 07:19:12 +0800 CST

Bash =~ regex e https://regex101.com/

  • 772

Usando https://regex101.com/ construí uma expressão regular para retornar a primeira ocorrência de um endereço IP em uma string.

RegExp:

(?:\d{1,3}\.)+(?:\d{1,3})

RegExp incluindo delimitadores:

/(?:\d{1,3}\.)+(?:\d{1,3})/

Com a seguinte string de teste:

eu-west                       140.243.64.99 

Ele retorna uma correspondência completa de:

140.243.64.99

Não importa o que eu tente com âncoras etc, o script bash a seguir não funcionará com a expressão regular gerada.

temp="eu-west                       140.243.64.99            "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
  echo "found a match"
else
  echo "No IP address returned"
fi
bash regular-expression
  • 3 3 respostas
  • 80710 Views

3 respostas

  • Voted
  1. Best Answer
    ilkkachu
    2018-02-03T07:28:35+08:002018-02-03T07:28:35+08:00

    \dé uma maneira não padronizada de dizer "qualquer dígito". Acho que vem do Perl, e muitas outras linguagens e utilitários também suportam REs compatíveis com Perl (PCRE). (e, por exemplo, o GNU grep 2.27 no trecho Debian suporta \wcaracteres semelhantes para palavras, mesmo no modo normal.)

    Bash não suporta \d, portanto, você precisa usar explicitamente [0-9]ou [[:digit:]]. O mesmo para o grupo de não captura (?:..), use apenas (..)em vez disso.

    Isso deve imprimir match:

    temp="eu-west                       140.243.64.99            "
    regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
    [[ $temp =~ $regexp ]] && echo match
    
    • 29
  2. Stéphane Chazelas
    2018-02-03T08:07:01+08:002018-02-03T08:07:01+08:00

    (:...)e \dsão operadores de expressão regular perl ou PCRE (como no GNU grep -P).

    bashsuporta apenas expressões regulares estendidas como em grep -Eexceto que para regexps passadas literalmente como em [[ text =~ regexp-here ]]oposição a como resultado de uma expansão sem aspas (como em [[ text =~ $var ]]ou [[ test =~ $(printf '%s\n' 'regexp-here') ]]), é limitado ao conjunto de recursos de expressão regular estendida POSIX.

    Portanto, mesmo em sistemas em grep -E '\d'que funcionaria (GNU EREs já importaram algumas extensões de perl regexps, como \sversões futuras \dtambém), você teria que usar:

    regexp='\d'
    [[ $text =~ $regexp ]]
    

    para bashque funcione ( [[ $text =~ \d ]]não funcionaria).

    Para um shell que suporta PCREs, você pode querer usar zsh:

    set -o rematchpcre
    [[ $text =~ '(?:\d{1,3}\.)+(?:\d{1,3})' ]]
    

    O ksh93 também suporta sua própria implementação de expressões regulares do tipo perl (não totalmente compatíveis) como parte de sua correspondência de padrões. Lá, você usaria:

    regexp='~(P)(?:\d{1,3}\.)+(?:\d{1,3})'
    [[ $text = $regexp ]]
    

    (observe o =em vez de =~. Você desejará usar variáveis ​​temporárias, pois é muito problemático quando não o faz)

    • 4
  3. user232326
    2018-02-03T10:37:42+08:002018-02-03T10:37:42+08:00

    O site regex101.com usa PCRE (veja o canto superior esquerdo) como padrão e não tem suporte para a sintaxe regex "Estendida". Isso é "Expressões regulares compatíveis com Perl", que vêm (como é razoável esperar) do Perl.

    PCRE é suportado por algumas ferramentas (como grep -P) sob algumas condições, mas o suporte bash regex dentro do [[…]]idioma é apenas para regex estendido (como grep -E).

    No regex estendido, o (?…)parêntese de não captura não existe e o \d também está ausente. Você precisa usar simples (…)e [0-9]:

    regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
    
    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve