Expressão regular não-gulosa para converter tags de comando

5

Antecedentes

Considere o seguinte texto:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use <cmd>rm</cmd> for
serif, <cmd>ss</cmd> for sans serif, and <cmd>tt</cmd> for teletype.

Gostaria de alterar <cmd>x</cmd> para {{cmd|x}} da seguinte forma:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

Problema

A expressão regular para correspondências não gananciosas é complicada. Por exemplo, o seguinte não funciona no vim:

:%s/<cmd>\(.*\)<\/cmd>.\{-}/{{cmd|}}/

Nem o seguinte, com sed:

sed -e "/(<cmd>\(.*\)</cmd>).\{-}/{{cmd|}}/"

Os parênteses tentam corresponder os parênteses, em vez de agrupar a expressão para aplicar o operador não-ganancioso de \{-} ou ? . Escapar dos parênteses é usado para referências anteriores, o que é necessário apenas para o conteúdo de texto dentro da tag <cmd> .

Pergunta

Qual é a sintaxe correta para substituir não-avidamente todas as ocorrências de <cmd>x</cmd> com {{cmd|x}} em um arquivo?

Nota: Esta não é uma tentativa de analisar HTML usando regex. ; -)

    
por Dave Jarvis 23.09.2013 / 00:45

1 resposta

5

Eu tentei isso no VIM: %s/<cmd>\(.\{-}\)<\/cmd>/{{cmd|}}/g e ele converte seu texto de demonstração em:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

Parece que sua primeira expressão regular no VIM está realmente perto de resolver seu quebra-cabeça, mas o uso de .\{-} não está no lugar correto.

Eu recebo a dica desta resposta: link

    
por 23.09.2013 / 01:31

Tags