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 / 515895
Accepted
Weijun Zhou
Weijun Zhou
Asked: 2019-04-28 09:35:59 +0800 CST2019-04-28 09:35:59 +0800 CST 2019-04-28 09:35:59 +0800 CST

Qual é a diferença entre `a[bc]d` (colchetes) e `a{b,c}d` (chaves)?

  • 772

Qual é a diferença entre a[bc]de a{b,c}d? Por que as pessoas usam a{b,c}dquando já existe a[bc]d?

brace-expansion pattern-matching
  • 2 2 respostas
  • 3825 Views

2 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2019-04-28T10:41:50+08:002019-04-28T10:41:50+08:00

    Os dois são bem diferentes.

    a[bc]dé um padrão de nome de arquivo (em shells diferentes de fish). Ele se expandirá para os dois nomes de arquivo abd e acdse esses forem nomes de arquivos existentes no diretório atual.

    • A [...]parte é uma expressão entre colchetes que corresponde a um único caractere dentre os listados (ou elementos de agrupamento quando os intervalos são incluídos). Para corresponder ao padrão a[bc]d, o caractere entre as strings ae dem um nome de arquivo deve ser a bou a c.

    • Se abdexistir, mas acdnão existir, então só se expandirá para abd, e vice-versa.

    • Se nem abd, nem acdexistir, dependendo do shell e das opções, ele acionaria um erro (original Unix sh, (t)csh, zsh, fish, bash -O failglob) e possivelmente sairia do shell, ou deixaria o padrão não expandido¹ (shells do tipo Bourne e rc-like) ou expandir para nada ( bash/zsh/yash -o nullglob, algumas versões mais antigas de fish, Unix original she (t)cshse houver outros globs correspondentes no mesmo comando).

    a{b,c}dé uma expansão de chaves (em shells que os suportam). Ele se expandirá para as duas strings abd e acd.

    • A {...}parte é um conjunto de strings delimitado por vírgulas (neste exemplo; em algum shell, também pode ser um intervalo como a..kou 20..25ou mais avançados como 00..20..2ou 0..20..2%02d), e a expansão é calculada combinando cada uma dessas strings com o flanqueamento cordas ae d. Essas strings podem ser maiores que um único caractere e também podem ser expansões de chaves.

    • A expansão acontece independentemente de essas strings corresponderem a nomes de arquivos existentes ou não.

    Se você estiver construindo strings, use uma expansão de chaves. Se você estiver combinando nomes de arquivos, use um padrão de nome de arquivo.


    ¹ Neste caso em particular, a[bc]dpoderia ser o nome de um arquivo existente e é por isso que é potencialmente perigoso usar coisas como rm -f ./*.[ch]nesses shells e rm -f ./*.{c,h}é um problema menor.

    • 43
  2. Weijun Zhou
    2019-04-28T09:35:59+08:002019-04-28T09:35:59+08:00

    a[bc]dé de correspondência de padrões e faz parte do padrão POSIX. No POSIX, isso é introduzido como a "expressão de colchetes de padrão". Está documentado na seção 2.13 do manual

    Quando sem aspas e fora de uma expressão entre colchetes, os três caracteres a seguir terão significado especial na especificação de padrões:

      ?
        Um ponto de interrogação é um padrão que deve corresponder a qualquer caractere.
      *
        Um asterisco é um padrão que deve corresponder a vários caracteres, conforme descrito em Padrões que correspondem a vários caracteres.
      [
        O colchete aberto deve introduzir uma expressão de colchete padrão.

    A seção 2.13.3 também menciona algo que se comporta de maneira diferente do que se esperaria para regexs usuais quando é usado para expansão de nome de arquivo (ênfase minha)

    As regras descritas até agora em Padrões que correspondem a um único caractere e Padrões que correspondem a vários caracteres são qualificadas pelas seguintes regras que se aplicam quando a notação de correspondência de padrões é usada para expansão de nome de arquivo:

    O caractere de barra em um nome de caminho deve ser correspondido explicitamente usando uma ou mais barras no padrão; não deve ser correspondido pelos caracteres especiais asterisco ou ponto de interrogação nem por uma expressão de colchetes. As barras no padrão devem ser identificadas antes das expressões de colchetes; portanto, uma barra não pode ser incluída em uma expressão de colchete padrão usada para expansão de nome de arquivo. Se um caractere de barra for encontrado após um caractere de colchete aberto sem escape antes que um colchete de fechamento correspondente seja encontrado, o colchete deve ser tratado como um caractere comum. Por exemplo, o padrão "a[b/c]d"não corresponde a nomes de caminho como abdou a/d. Ele corresponde apenas a um nome de caminho de literalmente a[b/c]d.

    a{b,c}dé expansão de chaves , não está na especificação do POSIX. Aqui está a parte correspondente do manual do bash (ênfase minha):

    A expansão de chaves é um mecanismo pelo qual strings arbitrárias podem ser geradas. Esse mecanismo é semelhante à expansão de nome de arquivo (consulte Expansão de nome de arquivo), mas os nomes de arquivo gerados não precisam existir . Os padrões a serem expandidos por chaves assumem a forma de um preâmbulo opcional, seguido por uma série de strings separadas por vírgula ou uma expressão de sequência entre um par de chaves, seguida por um postscript opcional. O preâmbulo é prefixado para cada string contida nas chaves, e o postscript é então anexado a cada string resultante, expandindo da esquerda para a direita.

    De acordo com o comentário de @mosvy, isso apareceu pela primeira vez, cshmas o comportamento bashé diferente de cshoutros shells. Este tipo de expansão de chaves também está presente em glob(3).

    Há outro tipo de expansão de chaves {a..z}que só apareceu após bash3.0, e há mais adicionados em bash4.0.

    Em um shell onde o globbing está ativado, execute em uma pasta vazia, o seguinte resultado é retornado

    $ echo a[bc]d
    a[bc]d
    $ echo a{b,c}d
    abd acd
    

    Em resposta ao comentário de @Jesse_b, se você estiver em um shell interativo e os dois se aplicarem, haverá a[bc]dmenos problemas para digitar. Por exemplo grep pattern [ab][12].txt.

    • 7

relate perguntas

  • grep vários padrões com contexto diferente

  • Por que em bash {{a,b}.{c,d}} se expande para {ac} {ad} {bc} {bd}

  • Expansão de chaves bash após uma barra de caminho

  • Como posso expandir uma lista de letras/números em cinzas?

  • "encontrar" com várias condições para copiar em outro disco rígido usando babun

Sidebar

Stats

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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

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

    • 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

    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
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • 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
    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

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