У меня есть текстовый документ, в котором есть текст, в котором после каждого письма добавляется дополнительный пробел!
Пример:
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…
Визуально:
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 ...
Обратите внимание, что после каждой буквы есть дополнительный пробел, поэтому между последовательными словами есть два пробела.
Есть ли способ, которым я могу получить awk
или sed
удалить лишние пробелы? (К сожалению, этот текстовый документ очень объемный, и его ручная обработка займет очень много времени.)
Я понимаю, что это, вероятно, гораздо более сложная проблема, которую нужно решить с помощью простого bash-скрипта, поскольку также необходимо распознавание текста.
Как я могу подойти к этой проблеме?
text-processing
sed
awk
scripting
lloowen
источник
источник
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'
Ответы:
Следующее регулярное выражение удалит первый пробел в любой строке пробелов. Это должно сделать работу.
Так что-то вроде:
... заменит infile.txt на "исправленную" версию.
источник
perl -pie
как показывает ваше редактирование. В чем причина этого? Пирог всегда работал хорошо для меня и является отличной мнемоникой. Изменилось ли поведение -i для обработки всего, что следует за расширением, а не только тех, которые начинаются с точки? Для них было бы странно ломать что-то идиоматическое.-i
. С другой стороны, я когда-либо использовал его только на компьютерах с Linux, и я не знал об этом больше нескольких лет, поэтому я не могу говорить о его старом поведении. На моей машине , хотя, это:perl -pie 's/a/b/' f
, выдает ошибку:Can't open perl script "s/o/A/": No such file or directory
. Покаperl -i -pe 's/o/A/' f
работает как положено. Так что да, этоe
расширение для резервного копирования.Используйте
wordsegment
пакет NLP для сегментации слов на чистом Python:источник
Основываясь на том факте, что ввод содержит двойные пробелы между словами, существует гораздо более простое решение. Вы просто заменяете двойные пробелы неиспользуемым символом, удаляете пробелы и заменяете неиспользуемый символ обратно пробелом:
... Выходы:
источник
sed -e "s/\([^ ]\) /\1/g"
Perl на помощь!
Вам нужен словарь, то есть файл, содержащий одно слово в строке. В моей системе он существует как
/var/lib/dict/words
, я также видел похожие файлы и/usr/share/dict/british
т. Д.Во-первых, вы помните все слова из словаря. Затем вы читаете входные данные построчно и пытаетесь добавить символы в слово. Если это возможно, вы запомните слово и попытаетесь проанализировать оставшуюся часть строки. Если вы достигаете конца строки, вы выводите строку.
Для вашего ввода он генерирует 4092 возможных показаний в моей системе.
источник
a cat a log
a c a t a l o g
Примечание: этот ответ (как и некоторые другие здесь) основан на более ранней версии вопроса, где слова не были разделены. На более новую версию можно ответить тривиально .
На входе вроде:
Вы можете попробовать:
Он обрабатывает слева направо и находит одно самое длинное слово после следующего.
Очевидно, что здесь не лучший выбор слов, так как это предложение не имеет никакого смысла, но чтобы найти правильное, вам понадобятся инструменты, способные понять грамматику или значение текста или хотя бы некоторую статистику. информация о том, какие слова могут быть найдены вместе, чтобы придумать наиболее вероятный набор слов. Похоже, решение - это специализированная библиотека, найденная Линн.
источник
Похоже на версию Деви Моргана, но с sed:
источник
sed
только GNU, и это не эквивалентно Dewi. Стандартнымsed
эквивалентом Дьюи было быsed 's/ \( *\)/\1/g'
Хотя это можно (и нужно) сделать с помощью однострочного Perl, небольшой синтаксический анализатор C тоже будет очень быстрым и также очень маленьким (и, надеюсь, очень правильным):
Составлено с
(программа чуть меньше 9кб)
Используйте в трубе, например:
источник
Я попробовал это, и это похоже на работу:
Команда
sed
захватывает две группы и возвращает только первую.источник
В C ++ я бы сделал это:
Изменит содержимое тестового текстового файла на ту же строку, но с удалением пробелов между буквами. (Требуется пробел между каждой буквой, чтобы быть точным).
источник
источник