Expressões regulares são úteis para muitas situações no coditiano linux. Hoje mesmo me deparei com a situação em que toda vez que altero uma migração, desejo refazer a migração do rails e para isso é necessário pegar a versão da migração. Encontrei um exemplo no stackoverflow que caiu bem.

No caso, será usado um arquivo chamado:

"db/migrate/20100301193807_create_tickets.rb"

Quando desejo refazer a migração executo o comando:

rake db:migrate:redo VERSION=20100301193807

Mas toda vez preciso escrever manualmente 20100301193807 e isso se torna uma tarefa chata.

Como sou um fãn do editor vim, enquanto edito o arquivo tenho a possibilidade de acessar o nome do arquivo através de uma variável chamada “%”. Através do comando “!” é possível executar um comando do shell. Desta forma é possível enviar algo para o shell e receber uma resposta.

Executando no modo de comando do vim, é possível executar o comando:

:!echo %

Que irá retornar algo como:

20100301193807_create_tickets.rb

Para pegar apenas os digitos da versão, é possível recuperar apenas os dígitos usandoo comando grep:

echo '20100301193807_create_tickets.rb' | grep -oEi '([0-9]+)'

Que irá retornar apenas:

20100301193807

Desta forma, é fácil de pegar a versão e colocar na área de transferência acrescentando pbcopy ao comando:

:! echo % | grep -oEi '([0-9]+)' | pbcopy

Automatizando a tarefa rake é possível executar com o auxílio das aspas ` `.

:!rake db:migrate:redo VERSION=`echo % | grep -oEi '([0-9]+)'` 

O comando grep também pode ser útil para ajudar a encontrar arquivos buscando pelo seu conteúdo.

Por exemplo, se eu não sei o nome da migration que cria os tickets posso fazer uma busca usando:

$ grep -r tickets db/migrate

Que irá retornar uma lista de ocorrências como:

db/migrate/20100301193807_create_tickets.rb:    create_table :tickets do |t|
db/migrate/20100301193807_create_tickets.rb:    drop_table :tickets

ps: aprendi essa do “grep -r” com o @leandroh

Para ficar mais parecido com o rak é bom adicionar a opção n para exibir o número da linha:

$ grep -nr tickets db/migrate

Que exibirá:

db/migrate/20100301193807_create_tickets.rb:3:    create_table :tickets do |t|
db/migrate/20100301193807_create_tickets.rb:15:    drop_table :tickets

Conclusão: divirta-se concatenando comandos!


Share → Twitter Facebook Linkedin


Hello there, my name is Jônatas Davi Paganini and this is my personal blog.
I'm developer advocate at Timescale and I also have a few open source projects on github.

Check my talks or connect with me via linkedin / twitter / github / instagram / facebook / strava / meetup.