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 / server / Perguntas / 178101
Accepted
Eonil
Eonil
Asked: 2010-09-05 08:08:10 +0800 CST2010-09-05 08:08:10 +0800 CST 2010-09-05 08:08:10 +0800 CST

Maneira mais simples de extrair substring no shell Unix?

  • 772

Qual é a maneira mais simples de extrair substring no shell Unix (com regex)?

Meios simples:

  • menos recurso
  • menos opções
  • menos estudo

Atualizar

Percebi que a própria regex está em conflito com a simplicidade e escolhi a mais simples cutcomo a resposta escolhida. Desculpe a pergunta vaga. Mudei o título para representar o estado atual deste controle de qualidade com mais precisão.

unix shell regex
  • 4 4 respostas
  • 147715 Views

4 respostas

  • Voted
  1. Best Answer
    gm3dmo
    2010-09-05T08:32:35+08:002010-09-05T08:32:35+08:00

    cutpode ser útil:

    $ echo hello | cut -c1,3
    hl
    $ echo hello | cut -c1-3
    hel
    $ echo hello | cut -c1-4
    hell
    $ echo hello | cut -c4-5
    lo
    

    Shell Builtins também são bons para isso, aqui está um script de exemplo:

    #!/bin/bash
    # Demonstrates shells built in ability to split stuff.  Saves on
    # using sed and awk in shell scripts. Can help performance.
    
    shopt -o nounset
    declare -rx       FILENAME=payroll_2007-06-12.txt
    
    # Splits
    declare -rx   NAME_PORTION=${FILENAME%.*}     # Left of .
    declare -rx      EXTENSION=${FILENAME#*.}     # Right of .
    declare -rx           NAME=${NAME_PORTION%_*} # Left of _
    declare -rx           DATE=${NAME_PORTION#*_} # Right of _
    declare -rx     YEAR_MONTH=${DATE%-*}         # Left of _
    declare -rx           YEAR=${YEAR_MONTH%-*}   # Left of _
    declare -rx          MONTH=${YEAR_MONTH#*-}   # Left of _
    declare -rx            DAY=${DATE##*-}        # Left of _
    
    clear
    
    echo "  Variable: (${FILENAME})"
    echo "  Filename: (${NAME_PORTION})"
    echo " Extension: (${EXTENSION})"
    echo "      Name: (${NAME})"
    echo "      Date: (${DATE})"
    echo "Year/Month: (${YEAR_MONTH})"
    echo "      Year: (${YEAR})"
    echo "     Month: (${MONTH})"
    echo "       Day: (${DAY})"
    

    Isso produz:

      Variable: (payroll_2007-06-12.txt)
      Filename: (payroll_2007-06-12)
     Extension: (txt)
          Name: (payroll)
          Date: (2007-06-12)
    Year/Month: (2007-06)
          Year: (2007)
         Month: (06)
           Day: (12)
    

    E de acordo com o Gnudif acima, sempre há sed/awk/perl para quando as coisas ficam realmente difíceis.

    • 19
  2. Phil P
    2011-01-06T02:08:35+08:002011-01-06T02:08:35+08:00

    Shells Unix tradicionalmente não possuem suporte a regex embutido. Bash e Zsh fazem isso, então se você usar o =~operador para comparar uma string com um regex, então:

    Você pode obter as substrings do $BASH_REMATCHarray no bash.

    No Zsh, se a BASH_REMATCHopção shell estiver definida, o valor está no $BASH_REMATCHarray, senão está no $MATCH/$matchpar de variáveis ​​vinculado (um escalar, o outro um array). Se a RE_MATCH_PCREopção for definida, o mecanismo PCRE será usado, caso contrário, as bibliotecas regexp do sistema, para uma correspondência de sintaxe regexp estendida, conforme o bash.

    Então, de forma mais simples: se você estiver usando o bash:

    if [[ "$variable" =~ unquoted.*regex ]]; then
      matched_portion="${BASH_REMATCH[0]}"
      first_substring="${BASH_REMATCH[1]}"
    fi
    

    Se você não estiver usando Bash ou Zsh, fica mais complicado, pois você precisa usar comandos externos.

    • 3
  3. mpb
    2018-04-19T08:25:15+08:002018-04-19T08:25:15+08:00

    Considere também /usr/bin/expr.

    $ expr substr hello 2 3
    ell
    

    Você também pode combinar padrões com o início de strings.

    $ expr match hello h
    1
    
    $ expr match hello hell
    4
    
    $ expr match hello e
    0
    
    $ expr match hello 'h.*o'
    5
    
    $ expr match hello 'h.*l'
    4
    
    $ expr match hello 'h.*e'
    2
    
    • 3
  4. Gnudiff
    2010-09-05T08:25:15+08:002010-09-05T08:25:15+08:00

    grep e sed são provavelmente as ferramentas que você deseja, dependendo da estrutura do texto.

    sed deve fazer o truque, se você não sabe o que é a substring, mas conhece algum padrão que está ao redor dela.

    por exemplo, se você quiser encontrar uma substring de dígitos que comece com um sinal "#", você pode escrever algo como:

    sed 's/^.*#\([0-9]\+\)/\1/g' yourfile
    

    grep poderia fazer algo semelhante, mas a questão é o que você precisa fazer com a substring e se estamos falando de texto delimitado por linha normal ou não.

    • 2

relate perguntas

Sidebar

Stats

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

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Como você reinicia o php-fpm?

    • 18 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Resolver o nome do host do endereço IP

    • 8 respostas
  • Marko Smith

    Como posso classificar a saída du -h por tamanho

    • 30 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    binaryorganic Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada? 2010-10-26 08:45:39 +0800 CST
  • Martin Hope
    tobym O que exatamente significam as cores nas barras de status htop? 2010-09-14 12:22:43 +0800 CST
  • Martin Hope
    MikeN No Nginx, como posso reescrever todas as solicitações http para https mantendo o subdomínio? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 Qual é a diferença entre colchetes duplos e simples no bash? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt Como funciona a sub-rede IPv4? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 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