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!