Pesquisa reversa em REGEX

regex_reverso-1_abertura

Dica rápida com expressões regulares. Quando você precisa buscar uma determinada palavra dentro de uma sequência¹ você faz algo mais ou menos assim…

$ lspci | egrep "^00:1[0-9]\.[0-9]"
00:14.0 USB controller: Intel Corporation Sunrise Point-LP USB 3.0...
00:14.2 Signal processing controller: Intel Corporation Sunrise Po...
00:15.0 Signal processing controller: Intel Corporation Sunrise Po...
00:16.0 Communication controller: Intel Corporation Sunrise Point-...
00:17.0 SATA controller: Intel Corporation Sunrise Point-LP SATA C...

Mas e se você deseja justamente fazer o contrário? No caso específico do comando grep basta simplesmente utilizar o parâmetro ou “– – invert-match“|”-v” para tal…

$ lspci | egrep --invert-match "^00:1[0-9]\.[0-9]"
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v6/7th Gen Cor...
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 6...
00:1c.0 PCI bridge: Intel Corporation Sunrise Point-LP PCI Express...
00:1c.5 PCI bridge: Intel Corporation Sunrise Point-LP PCI Express...
00:1f.0 ISA bridge: Intel Corporation Device 9d4e (rev 21)
00:1f.2 Memory controller: Intel Corporation Sunrise Point-LP PMC... 
00:1f.3 Audio device: Intel Corporation Sunrise Point-LP HD Audio... 
00:1f.4 SMBus: Intel Corporation Sunrise Point-LP SMBus (rev 21)
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL81...
02:00.0 Network controller: Qualcomm Atheros QCA9377 802.11ac Wire...

Mas e se o que você precisa, não pode ser feito através do grep?

(¹) Uma pesquisa simples, tudo que comece com “00:1”, tenha qualquer dígito entre  0 e 9, um ponto (“.”) e outro dígito entre 0 e 9.

Continuar lendo

Anúncios

Sincronizando um repositório replicado do git

fork-1_abertura

Quando é usada a opção de fork¹ para replicar² um repositório git, o resultado final será um novo repositório contendo a mesma história do original (os commits passados) porém independente dele a partir deste ponto (os commits futuros). Algo diferente do que acontece quando é utilizado o git clone para copiar um repositório remoto pois ele permanece ligado ao original e sendo possível mantê-lo sincronizado — git pull — como também enviar novos commitsgit push — para ele.

TL;DR! Pode saltar o resto da explicação se preferir…

A interação entre os repositórios de origem e o replicado acontece a partir da ferramenta utilizada para o gerenciamento dos repositórios (ver nota 1) através do pull request. Que basicamente é um instrumento que permite aplicar commits vindos “de fora” ao repositório e mediante intervenção humana para fazer a validação. O mesmo também acontece com o git push no envio dos commits do repositório clonado para o remoto com a diferença de que como você precisa ter permissões para fazê-lo eles são automaticamente aplicados³.

Até aí tudo bem se considerarmos dois casos bem específicos: (i) repositório remoto com contribuições que virão sempre de membros válidos trabalhando a partir de repositórios clonados ou; (ii) repositório replicado que terá um desenvolvimento distinto daquele no qual ele se originou.

Mas existe um terceiro caso, aquele em que você faz a réplica de um repositório ao qual não é membro mas ao qual não dá para como combinar com os membros dele para que aguardem seus pull requests. Não é estritamente necessário mas é recomendável para não trabalhar em versões (muito) antigas dos arquivos.

E este é fim desta longa introdução! 🙂

(¹) A opção está disponível nas interfaces de gerenciamento de repositórios, como BitBucket, GitHub GitLab etc não na ferramenta (git) em si.

(²) A tradução seria “bifurcado” mas creio que “replicado” é um termo bem melhor.

(³) Em alguns casos, o administrador do repositório pode proibir a atualização em ramos específicos, como o master e neste caso também é necessário utilizar um pull request para aplicar suas alterações.

Continuar lendo

Usando grupos em expressões regulares

grupos_regex-1_abertura

Na primeira parte da introdução às expressões regulares, falei dos grupos e que eles servem para agrupar valores distintos para uma pesquisa, ou seja, se você quiser pesquisar pelos nomes perl, python ou ruby em uma determinada sequência basta fazer algo como “(perl|python|ruby)” para tentar encontrá-los. Mas acontece que os grupos não servem só para isto.

Com eles é possível não só localizar mas também fazer referência ao que foi encontrado e assim ampliar as funcionalidades de algumas ferramentas. E aqui alguns exemplos bem simples…

Continuar lendo

Bases numéricas em Bash

base_numerica_bash-1_abertura

Algo que só fui me dar conta pois aconteceu de um script em Bash resultar em um erro ao tentar fazer uma simples operação de adição! O motivo? Um simples zero à esquerda do número e que resultou uma certa perda de tempo mas também na “descoberta” que o o Bash sabe tratar outras bases numéricas além da, óbvia, decimal! 🙂

Continuar lendo

Instalação do Wordpress com Vagrant

wordpress-1_abertura

Esta é uma configuração do Vagrant que preparei para automatizar a instalação do WordPress em uma máquina virtual rodando a versão 17.10 do Ubuntu, com as versões 2.4 do Apache HTTP Server, 7.1 do PHP, 10.1 do MariaDB, a última versão estável¹ do WordPress e outras dependências.

Na verdade não há mistério na instalação de todo este ecossistema, o problema está nos “pequenos detalhes” que podem te fazer perder algum tempo caso sejam esquecidos — e o serão quando se tem alguma pressa! 🙂

(¹) Por enquanto a versão é a 4.9.

Continuar lendo

Inserção no início do arquivo com ‘sed’

incluir_sed-1_abertura

Bem. para inserir conteúdo no final de um arquivo já existente basta redirecioná-lo utilizando o “>>”, isto é, utilizar comandos como «echo “mensagem” >> arquivo1» ou então «cat arquivo2 >> arquivo1» para realizar a tarefa. Mas como fazer o oposto? Isto é, inserir conteúdo no início sem necessariamente criar um arquivo intermediário no processo? Uma maneira de fazê-lo é utilizando o sed.

Continuar lendo