Aqui está um que funciona no caso simples de apenas um nível de comandos dentro de um \edit{...}
, no máximo:
perl -00 -lpe 's,\edit\{( (?: [^}\]* | \[a-z]+\{[^}]*\} )+ )\},$1,xg'
A parte do meio (?: [^}\]* | \[a-z]+\{[^}]*\} )+
tem que alternativas:
[^}\]*
corresponde a qualquer string sem chave de fechamento ou barra invertida (texto normal); e \[a-z]+\{[^}]*\}
corresponde a qualquer coisa com barra invertida, letras minúsculas e, em seguida, um par de chaves correspondente (como \url{whatever...}
). O agrupamento (?:...)+
repete essas alternativas e a captura de parênteses externa, para que possamos substituir a correspondência apenas com a parte dentro de \edit{...}
.
-00
diz ao Perl para manipular a entrada de um parágrafo no tempo, com linhas vazias separando parágrafos. Se você precisar manipular tags que abrangem parágrafos, altere para -0
para manipular toda a entrada de uma só vez.
Para o seu exemplo, isso parece funcionar, dando:
We Introduce a model for analyzing \emph{data} from various
experimental designs, such as paired or \url{http://www/}
longitudinal; as was done 1984 by NN \cite{mycitation} and by NNN
\cite{mycitation2}.
No entanto, ele (previsivelmente) falha por uma entrada com dois níveis de comandos dentro do \edit{...}
:
Some \edit{\somecmd{\emph{nested} commands} here}.
Vira para:
Some \somecmd{\emph{nested} commands here}.
(a chave de fechamento errada é removida)
Na verdade, o manuseio de parêntesis equilibrados é um pouco mais complicado. nesta pergunta sobre SO: Expressão regular Perl: combine colchetes aninhados .