sed one-liner para excluir espaços medianos

2

Eu tenho um arquivo de texto que consiste em alguns WANDES N ORMAL E nGLISH em letras maiúsculas. Infelizmente, todas estas palavras têm um espaço entre as primeiras e as seguintes, o que não é aceitável. Eu tentei escrever uma expressão sed que correspondesse a essas ocorrências sed 's/[A-Z] [A-Z][A-Z]*/ e tive sucesso. No entanto, não consegui escrever a parte de substituição.

    
por ixtmixilix 08.07.2011 / 11:45

1 resposta

6

Você precisaria agrupar as duas partes da palavra e usá-las como backreferences na substituição assim:

sed -e 's/\([A-Z]\) \([A-Z]\+\)//g'

Note que também alterei seu uso de * para + para indicar 1 ou mais ocorrências do caractere anterior em vez de 0 ou mais , salvando um pequeno passo.

Você também pode ter problemas com essa expressão toda se a palavra 'eu' for encontrada sozinha. Você tem alguma outra coisa que você pode combinar para saber se eu deveria ser sua própria palavra ou se juntou ao próximo? E quanto a 'A' e outras palavras de uma única letra?

Eu recomendo combinar este texto simples hackear com algum tipo de corretor ortográfico para ajudar a verificar erros cometidos pela substituição, como "ABIRD" ou "IWENT". Nenhuma quantidade de regex fiddling vai lhe dar um resultado perfeito em um grande corpus de texto quebrado como você descreveu, mas uma vez que você tenha feito alguma limpeza com regex, você pode ir para métodos mais afinados como corretores ortográficos (que podem também ser executado a partir da linha de comando e automatizado) para limpar as coisas. Finalmente, faça uma revisão humana!

    
por 08.07.2011 / 12:08