Busca e Substituição em massa com Notepad++
   2 min leitura

No meu workflow de criação de artigos vejo-me confrontado com o facto de precisar de converter tags em shortcodes Hugo, e de retirar os escapes a todos os caracteres que o Pandoc acha que tem de proteger.
Fazer isso operação a operação é o tipo de trabalho que me faz correr para algum tipo de automatização - e por isso é que eu digo que sou o maior preguiçoso do mundo.
Tentei arranjar algum tipo de plugin para Notepad++ ou VSCode que me ajudassem, mas no final, todos tinham algum problema; nomeadamente, como os meus alvos e as minhas substituições têm muitos caracteres especiais, queria evitar ferramentas que usassem expressões regulares.

Sim, o *NIX foi inventado para este tipo de trabalhos, e ferramentas como o sed seriam perfeitas para o que eu quero. Menos a parte das expressões regulares…

Acabei por perceber que não conseguia encontrar nada que não usasse expressões regulares. trombone.wav

Solução com Notepad++

Eventualmente, depois de partir muita pedra, percebi que podia fazer isso com a busca normal do Notepad++, porque este aceita expressões regulares PCRE. E em PCRE, é possível construir uma única expressão feita de muitas cadeias de captura e substituição, com este formato:

Busca Substituição
(ta)|(te)|(ti) (?1pa)(?2pe)(?3pi)

O problema da profusão de caracteres de escape acabou por ser resolvido com string literals, que estava habituado em .NET como @"foo", mas que em regex normal não funcionam; no entanto, o PCRE tem string literals através da construção \Qfoo\E
Para os outros, capturar \_ implica escapar o \(\\) e o _(\_): o resultado é \\\_
Depois, ainda tive de resolver o problema de ter de escapar caracters na substituição; mas felizmente em PCRE só é necessário escapar $, \, (, ), ?, e :

Por exemplo:

  • < e > saem da conversão Pandoc como &lt; e &gt;:
  • retirar os escapes a \,_,`,*,[, ], (.),|

Busca:

 (&gt;)|(&lt;)|(\\\\)|(\\\_)|(\\\`)|(\\\*)|(\\\[)|(\\\])|(\\\()|(\\\))|(\\\|)

Substituição

(?1>)(?2<)(?3\\)(?4_)(?5`)(?6*)(?7[)(?8])(?9\()(?10\))(?11|)

É preciso muita, MUITA atenção porque nem tudo se escapa nas substituições…

Com esta funcionalidade, posso usar abreviaturas para os shortcodes e acelerei imenso a preparação destes artigos.
Se o que demora mais é aprender e documentar, essa também é a parte divertida; converter a minha documentação num artigo para publicar é que devia ser o mais automático e imediato possível, para poder continuar a aprender e documentar…