Evita que o sed imprima coisas vazias

0
sed -e 's/\([A-Za-z]*\)\( \)\([A-Za-z]*\)\(:\?\)\([A-Za-z]*\)\?\( \)\?\(.*\)\?/[][][][][][][]/'

vai decorar

class VoxelbuilderAdda:public VoxelBuilder

Então parece que

[class][ ][VoxelbuilderAdda][:][public][ ][VoxelBuilder]

Se eu tiver

class VoxelBuilder

A saída é

[class][ ][VoxelBuilder][][][][]

É possível impedir que ele imprima os colchetes vazios?

O objetivo é imprimir todos os identificadores com o mesmo (colchetes são meus marcadores simples, mas eu deveria tê-los excluído das palavras-chave)

\textclassname{VoxelBuilder}

e deixe palavras-chave (class, struct, public, ...) e separadores como ':' como estão.

Obviamente, um padrão invertido para palavras-chave + separador é mais benéfico, mas não consegui descobrir . Eu realmente quero

Substitua a sequência X por \ textclassname {X} somente se X não for um dos

  • class
  • struct
  • union
  • public
  • private
  • protected
  • virtual
  • :
  • ,
  • <
  • >

Eu tirei chaves e ponto-e-vírgula em uma etapa anterior. O objetivo seria

class \textclassname{VoxelbuilderAdda}:public \textclassname{VoxelBuilder}

Sem herança

class \textclassname{VoxelbuilderAdda}

Se eu não tivesse o operador disponível, ele não apenas cobriria os que eu tenho, mas também qualquer herança múltipla estranha.

    
por user877329 12.08.2015 / 13:06

2 respostas

0

Para esse tipo de conversão, é melhor usar ferramentas de análise especiais, mas se você quiser operar o arquivo como um texto, tente:

sed 's/\(::\|[<, ]\)\(\w\+\)/\textclassname{}/g' filename

ou use a opção -r para evitar escape extra:

sed -r 's/(::|[<, ])(\w+)/\textclassname{}/g' filename
    
por 12.08.2015 / 14:10
1

então você tem que tratar espaços, palavras e dois pontos separadamente:

sed -e 's/[A-Za-z]\{1,\}/[&]/g' -e 's/:/[&]/g' -e 's/ /[&]/g'

isso substituirá a) uma ou mais \{1,\} ocorrências de qualquer letra com o padrão & entre colchetes, b ec) substituirá um único cólon (espaço) por si mesmo entre colchetes

echo class VoxelbuilderAdda:public VoxelBuilder | sed -e 's/[A-Za-z]\{1,\}/[&]/g' -e 's/:/[&]/g' -e 's/ /[&]/g'
[class][ ][VoxelbuilderAdda][:][public][ ][VoxelBuilder]
    
por 12.08.2015 / 13:13

Tags