Eu tenho um documento de texto que tem uma carga de texto que tem um espaço extra adicionado após cada letra!
Exemplo:
T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t…
Visualmente:
T␣h␣e␣␣b␣o␣o␣k␣␣a␣l␣s␣o␣␣h␣a␣s␣␣a␣n␣␣a␣n␣a␣l␣y␣t␣i ␣c␣a␣l␣␣p␣u␣r␣p␣o␣s␣e␣␣w␣h␣i␣c␣h␣␣i␣s␣␣m␣o␣r␣e␣␣i␣ m␣p␣o␣r␣t␣a␣n␣t…
Observe que há um espaço extra após cada letra, portanto, há dois espaços entre palavras consecutivas.
Existe uma maneira de obter awk
ou sed
excluir os espaços extras? (Infelizmente, este documento de texto é enorme e levaria muito tempo para ser processado manualmente.)
Compreendo que esse seja provavelmente um problema muito mais complexo a ser resolvido com apenas um script bash simples, pois também precisa haver algum tipo de reconhecimento de texto.
Como posso abordar esse problema?
text-processing
sed
awk
scripting
lloowen
fonte
fonte
echo 't h i s i s a n e x a m p l e' | sed 's/ //g'
echo 'T h i s ; i s .a n 9 8 e x a m p l e' | perl -pe 's/[a-z]\K (?=[a-z])//ig'
Respostas:
O regex a seguir removerá o primeiro espaço em qualquer sequência de espaços. Isso deve fazer o trabalho.
Então, algo como:
... substituirá infile.txt por uma versão "fixa".
fonte
perl -pie
- como mostra sua edição. Qual é a justificativa para isso? A torta sempre funcionou bem para mim e é um ótimo mnemônico. O comportamento de -i mudou para tratar qualquer coisa que se segue como uma extensão, em vez de apenas as coisas que começam com um ponto? Pareceria estranho para eles quebrar algo tão idiomático.-i
. Por outro lado, eu só o usei em máquinas Linux e não o conheço há mais de alguns anos, por isso não posso falar sobre seu comportamento mais antigo. No meu embora máquina, isto:perl -pie 's/a/b/' f
, produz um erro:Can't open perl script "s/o/A/": No such file or directory
. Enquantoperl -i -pe 's/o/A/' f
trabalha como esperado. Então, sim,e
é considerado como a extensão de backup.Use
wordsegment
, um pacote NLP de segmentação de palavras em Python puro:fonte
Com base no fato de que a entrada inclui espaços duplos entre as palavras, existe uma solução muito mais simples. Você simplesmente altera os espaços duplos para um caracter não utilizado, remove os espaços e altera o caracter não utilizado de volta para um espaço:
... saídas:
fonte
sed -e "s/\([^ ]\) /\1/g"
Perl para o resgate!
Você precisa de um dicionário, ou seja, um arquivo listando uma palavra por linha. No meu sistema, ele existe como
/var/lib/dict/words
, também vi arquivos semelhantes como/usr/share/dict/british
etc.Primeiro, você se lembra de todas as palavras do dicionário. Em seguida, você lê a entrada linha por linha e tenta adicionar caracteres a uma palavra. Se possível, lembre-se da palavra e tente analisar o resto da linha. Se você chegar ao final da linha, você produzirá a linha.
Para sua entrada, ele gera 4092 possíveis leituras no meu sistema.
fonte
a cat a log
iea c a t a l o g
Nota: esta resposta (como algumas outras aqui) é baseada em uma versão anterior da pergunta em que as palavras não foram delimitadas. A versão mais recente pode ser respondida trivialmente .
Em uma entrada como:
Você poderia tentar:
Ele processa da esquerda para a direita e encontra uma palavra mais longa após a seguinte.
Obviamente, aqui, não é a melhor seleção de palavras, pois essa frase não faz sentido, mas, para chegar à correta, você precisará de ferramentas capazes de entender a gramática ou o significado do texto ou, pelo menos, algumas estatísticas. informações sobre quais palavras provavelmente serão encontradas para criar o conjunto de palavras mais provável. Parece que a solução é uma biblioteca especializada, encontrada por Lynn
fonte
Semelhante à versão de Dewi Morgan, mas com sed:
fonte
sed
apenas o GNU e não é equivalente ao de Dewi. Osed
equivalente padrão de Dewi's seriased 's/ \( *\)/\1/g'
Embora possa (e deva) ser feito com uma linha única do Perl, um pequeno analisador C também seria muito rápido e também é muito pequeno (e espero que muito correto):
Compilado com
(o programa é um pouco menor que 9kb)
Use em um tubo como por exemplo:
fonte
Eu tentei isso e parece funcionar:
O
sed
comando captura dois grupos e retorna apenas o primeiro.fonte
Em c ++, eu faria isso:
Alterará o conteúdo do arquivo de texto de teste, na mesma sequência, mas com os espaços entre as letras removidos. (Requer um espaço entre cada letra para ser preciso).
fonte
fonte