Bash regexps para iniciantes com exemplos

Bash regexps para iniciantes com exemplos

O uso de expressões regulares em Bash fornece bastante poder para analisar quase todas as cordas de texto concebíveis (ou mesmo documentos completos) e transformá -los em quase qualquer saída desejável. Se você usa regularmente o Bash, ou se trabalha regularmente com listas, seqüências de textuais ou documentos no Linux, descobrirá que muitos empregos podem ser simplificados ao aprender a usar expressões regulares no Bash. Continue lendo para aprender habilidades básicas de expressão regular! Se você já está familiarizado com expressões regulares básicas no Bash ou em outro idioma de codificação, consulte nossas expressões regulares mais avançadas. Caso contrário, continue lendo para aprender habilidades básicas de expressão regular!

Neste tutorial, você aprenderá:

  • Como usar expressões regulares na linha de comando em bash
  • Como as expressões regulares podem analisar e transformar qualquer string de texto e/ou documento
  • Exemplos básicos de uso de expressões regulares em Bash
Bash regexps para iniciantes com exemplos

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente da distribuição Linux
Programas Linha de comando Bash, sistema baseado em Linux
Outro O utilitário sed é usado como uma ferramenta de exemplo para empregar expressões regulares
Convenções # - requer que os comandos linux -comidos sejam executados com privilégios de raiz diretamente como usuário root ou por uso de sudo comando
$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular


Exemplo 1: Nossa primeira expressão regular

Existem vários utilitários comuns de linha de comando, como sed e grep, que aceitam entrada de expressão regular. E você não precisa fazer nenhuma alteração na ferramenta (uso ou configuração) para poder usar expressões regulares; Eles são por padrão regex-consciente. Vejamos um exemplo não régex onde mudamos abc em XYZ primeiro:

$ echo 'abc' | sed 's/abc/xyz/' xyz 

Aqui usamos o eco para gerar a string abc. Em seguida, passamos a saída deste eco (usando o tubo, eu.e. |, personagem) para a utilidade sed. SED é um editor de fluxo para filtrar e transformar texto. Encorajo você a conferir seu manual detalhado digitando homem sed Na linha de comando.

Uma vez passado para a Sed, estamos transformando a corda usando uma sintaxe específica de sed (e regex). O comando que passamos para sed (ou seja, s/abc/xyz/) também pode ser lido como Substitua ABC por Wyz. O s significa substituto e o personagem separador (/ no nosso caso) indica onde uma seção do comando termina e/ou outro inicia. Observe que também podemos usar outros caracteres separadores no SED, como |, Como veremos em exemplos posteriores.

Agora, vamos mudar este comando em um exemplo de expressão regular.

$ echo 'abc' | sed 's/./xyz/g 'xyzxyzxyz 


Uau, o que aconteceu aqui? 🙂

Fizemos algumas pequenas mudanças, que afetaram significativamente a saída resultante. Em primeiro lugar, trocamos abc na linha de comando sed para .. Este não é um ponto regular/literal, mas um ponto de expressão regular. E, em expressão regular, um ponto significa qualquer personagem. As coisas devem começar a parecer mais claras agora, especialmente quando você percebe a outra pequena mudança que fizemos: g. A maneira mais fácil de pensar sobre g é como global; uma pesquisa repetitiva e substituição.

Observe aqui também como s é o nosso comando sed real, seguido pelas opções para esse comando (os dois de textos de substituição), e o g é um qualificador sobre o comando. Compreender isso bem ajuda você a aprender a sintaxe sed ao mesmo tempo.

Portanto, em algum contraste com o nosso exemplo de expressão não regular do punho e na linguagem natural, este novo comando pode ser lido como Substitua qualquer caractere-single-caractere por XYZ, e repetidamente ('globalmente') o faça até chegar ao final da string. Em outras palavras, a é alterado para XYZ, b é alterado para XYZ etc., resultando na saída tripla de XYZ.

Tudo a bordo? Ótimo! Você acabou de aprender a usar expressões regulares. Vamos mergulhar mais.

Exemplo 2: Uma pequena ressalva

$ echo 'abc' | sed 's | \.| xyz | g 'abc 

Opa. O que aconteceu? Fizemos algumas pequenas mudanças, e a saída mudou substancialmente, como em nosso exemplo anterior. Expressões regulares são muito poderosas, pois você pode começar a ver aqui, e até uma pequena mudança pode fazer uma grande diferença na saída. Portanto, geralmente é necessário testar bem suas expressões. E, embora não seja o caso aqui, também é muito importante considerar sempre como a saída de expressões regulares pode ser afetada por diferentes entradas. Freqüentemente, uma entrada ligeiramente alterada ou modificada produz uma saída muito diferente (e muitas vezes errônea).

Mudamos dois itens menores; Colocamos um \ antes do ponto, e mudamos os separadores de / para |. A última mudança não fez absolutamente nenhuma diferença, como podemos ver nesta saída;

$ echo 'abc' | sed 's |.| xyz | g 'xyzxyzxyz 


E podemos verificar nossas descobertas até agora usando este comando:

$ echo 'abc' | sed 's/\./XYZ/G 'ABC 

Como esperado, o | para / Mudança não fez diferença.

Então, de volta ao nosso dilema - vamos dizer que a pequena mudança de adição \ está em falta? Mas é realmente uma falha?

Não. O que fizemos ao fazer essa mudança simples é fazer o . DOT em um literal (\.) DOT. Em outras palavras, essa não é mais uma expressão regular real no trabalho, mas uma simples substituição de cordas textuais que pode ser lida como substitua qualquer ponto literal em XYZ, e faça isso repetidamente.

Vamos provar isso;

$ echo 'ab… c' | sed 's/\./xyz/g 'abxyzxyzc 

Isso é o esperado: os dois pontos literais foram alterados, individualmente (devido à natureza repetitiva do g qualificador), para XYZ, rendimento geral abxyzxyzc.

Super! Vamos expandir um pouco mais agora.

Exemplo 3: traga -o

Nada como mergulhar na cabeça primeiro, certo? Talvez. Até que você veja isso;

$ echo 'a… b… c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd 

Sim, muito complexo, pelo menos à primeira vista. Vamos começar com uma simplificação dele:

$ echo 'a… b… c' | sed 's | [\.b] \+| d | g; ' ADC 


Ainda parece um pouco complicado, mas você logo entenderá. Então, pegando a sequência de entrada de a… b… c, Podemos ver - com base em nosso exemplo anterior - que estamos procurando um ponto literal (\.). No entanto, neste caso, é seguido por b e cercado por [[ e ]. Esta parte da expressão regular ([\.B]) pode ser lido como qualquer ponto literal, ou o personagem b (até agora, de forma não repetitiva; eu.e. Uma única carta, qualquer um deles, corresponderá a este seletor).

Em seguida, qualificamos isso um pouco mais adiante, anexando \+ para isso caixa de seleção. O \+ indica que estamos procurando pelo menos um, e possivelmente mais, desses personagens listados (literal ponto e b). Observe que os personagens procurados por necessidade de estar bem um ao lado do outro, em qualquer ordem.

Por exemplo o texto … B… bbbb… ainda seria comparado como uma única ocorrência, enquanto … B… bbb… b.B… BB (Observe que o espaço) seria correspondente como separado (repetitivo) ocorrências, e ambos (eu.e. não apenas o primeiro) seria correspondido. E, nesse caso, ambos seriam acionados devido ao g qualificador global/repetitivo.

Em outras palavras, na linguagem natural, poderíamos ler essa expressão regular como substitua qualquer sequência contígua dos personagens . e b com d e faça isso repetidamente.

Você pode ver o que acontece? Na sequência de entrada que temos … B… , que é combinado pela expressão regular, pois contém apenas \. e b personagens. É então substituído por d resultando em ADC.

Nosso exemplo maior agora parece mais simples de repente. Vamos voltar a ele:

$ echo 'a… b… c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd 

Pensando em como a primeira parte do comando sed se transformou a… b… c em ADC, Agora podemos pensar sobre isso ADC como entrada para o segundo comando no sed; s | [a-c] | d | g. Observe como os dois comandos sed são separados por ;.

Tudo o que acontece é que a saída do primeiro é tomada como entrada para o comando subsequente. Isso quase sempre funciona, embora haja momentos (ao usar modificação complexa de texto/documento), onde é melhor passar a saída de um comando sed real para outro comando sed usando um tubo de bash (|).

Analisando o segundo comando (s | [a-c] | d | g) Vemos como temos outro caixa de seleção que selecionará letras de A a C ([a-c])); o - indica uma variedade de letras, que fazem parte da sintaxe de expressão regular.

As outras partes deste comando falam por si mesmas agora. No total, este segundo comando pode ser lido como Substitua qualquer caráter literal por alcance a-c (i.e. a, b ou c) em d e faça isso repetidamente. O resultado é que a A, D e C (saída de ADC do nosso primeiro comando) são renderizados em DDD.

Esse comando muito complexo não parece mais tão assustador agora, faz isso? Vamos arredondar.

Exemplo 4: Uma mensagem de despedida

eco 'tenha um ótimo dia' | sed 's | $ | all |; s | y | y to |; s | $ | you | tudo | ' 


Você pode descobrir isso? Dica; $ significa fim da linha em expressões regulares. Todo o restante deste complexo Regex está usando o conhecimento deste artigo. Qual é a saída? Veja se você consegue descobrir usando um pedaço de papel, sem usar a linha de comando. Se você fez - ou se você não fez 🙂 - informe -nos nos comentários abaixo.

Conclusão

Neste tutorial, tivemos uma introdução às expressões regulares básicas, juntadas a alguns exemplos mais avançados (de nitidez).

Ao aprender expressões regulares e verificar o código de outras pessoas, você verá expressões regulares que parecem complexas. Reserve um tempo para descobrir e brincar com expressões regulares na linha de comando. Você em breve será um especialista e, embora seja necessário análise de regexes complexos (a mente simplesmente não se presta prontamente à leitura de informações tão densas), ela ficará mais fácil. Você também descobrirá que um regex de aparência complexa, em análises adicionais, geralmente parece bastante simples depois de entender - assim como nos exemplos acima.

Agora você também pode ler nosso artigo sobre expressões regulares no Python, pois muitas das informações fornecidas lá também se aplica a expressões regulares, embora alguns dos requisitos de formatação sejam ligeiramente diferentes. Isso aumentará sua compreensão das expressões regulares, como usá -las e como aplicá -las em várias situações e idiomas de codificação. Depois de se tornar um especialista regex, as pequenas linhas de distinção entre ferramentas e linguagens de programação geralmente desaparecem, e você tenderá a se lembrar de requisitos específicos de sintaxe para cada idioma ou ferramenta em que trabalha/com/com.

Aproveitar!

Tutoriais do Linux relacionados:

  • Bash Regex avançado com exemplos
  • Coisas para instalar no Ubuntu 20.04
  • Expressões regulares do Python com exemplos
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Manipulação de big data para diversão e lucro Parte 3
  • Manipulação de big data para diversão e lucro Parte 1
  • Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
  • Coisas para instalar no Ubuntu 22.04
  • Bash idiomas variáveis ​​avançados para sensibilidade ao caso…