У меня есть привычка писать по одной строке на предложение, потому что я обычно компилирую вещи в LaTex или пишу в каком-то другом формате, где разрывы строк игнорируются. Я использую пустую строку, чтобы указать начало нового абзаца.
Теперь у меня есть файл, написанный в этом стиле, который я хотел бы просто отправить в виде простого текста. Я хочу удалить все одиночные разрывы строк, но оставлю их без изменений. Вот что я сделал:
sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Это заменяет пустые строки некоторым текстом, который, я уверен, не появляется в файле: NEWLINE
затем он удаляет все разрывы строк с помощью awk (я нашел этот трюк на каком-то веб-сайте), а затем заменяет NEWLINE
s необходимыми двумя переносами строк. ,
Это похоже на длинный способ сделать довольно простую вещь. Есть ли более простой способ? Кроме того, если бы был способ заменить несколько пробелов (которые иногда по какой-то причине закрадывались) на отдельные пробелы, это тоже было бы хорошо.
Я использую emacs, так что если есть какой-то трюк, специфичный для emacs, это хорошо, но я бы предпочел увидеть версию sed или pure awk.
tr -d "\n"
.Ответы:
Вы можете использовать awk следующим образом:
Или если вам нужен дополнительный перевод строки в конце:
Или, если вы хотите отделить абзацы новой строкой:
Эти команды awk используют действия, которые защищены шаблонами:
или
Следующее действие выполняется, только если шаблон соответствует текущей строке.
И
^$.
символы имеют особое значение в регулярных выражениях, где^
соответствует начало строки,$
конец и.
произвольный символ.источник
/./
делает: кажется, что ведет себя как иelse
для/^$/
совпадения строк, это правильно?Используйте режим абзаца в Awk или Perl для обработки файла абзац за абзацем, где абзацы разделены пустыми строками.
Конечно, так как это не анализирует (La) TeX, он будет ужасно искажать комментарии, дословное окружение и другой специальный синтаксис. Возможно, вы захотите взглянуть на DeTeX или другие (La) TeX-текстовые конвертеры.
источник
Sed Solution
Обратите внимание, что в этом решении
:a
создается метка, а неa
команда.Замена нескольких пробелов
Используйте
tr
:$ tr -s ' ' <test.text
источник
Если я правильно понял, то пустая строка включает в себя две последовательные переводы строк,
\n\n
.Если это так, то одним из возможных решений будет устранение всех случаев появления новых строк.
В Perl предварительное утверждение является одним из способов достижения этого:
-0777
Флаг эффективно хлебает весь файл в одну строку-p
говорит Perl напечатать строку, над которой он работает по умолчанию-i
определяет редактирование на местеисточник
(возрождая древний вопрос)
Похоже, это именно то, что
fmt
иpar
для переформатирования абзаца. Как и вы (а также многие программы), они определяют границы абзаца как одну (или более) пустую строку. Попробуйте передать текст через один из них.fmt
является стандартной утилитой Unix и может быть найдена в GNU Coreutils.par
это сильно улучшенный текст,fmt
написанный Адамом М. Костелло, который можно найти по адресу http://www.nicemice.net/par/ (он также был упакован для нескольких дистрибутивов, включая Debian - я упаковал его для Debian в январе 1996 года, хотя теперь есть новый сопровождающий для pkg.)источник
sed
добавит любую строку вH
старое пространство, которое содержит хотя бы один символ. Это сразу же означает,d
что все те, за исключением, возможно, последнего. Единственные строки, которые могут остаться, являются пробелами, и именно на этих линияхsed
ex
изменяет пробелы удержания и образца и удаляет все накопленные\n
символы ewline.Если вы хотите, чтобы строки, содержащие только <табуляции> или <пробелы>, считались пустыми, замените
/./
адрес выше на/[^[:blank:]]/
. Чтобы также сжать пробелы, сделайте:источник
Увидев компактные примеры Жиля по perl и awk, я не захотел публиковать это, но я уже прошел это упражнение, и это действующий сценарий, который достаточно документирован; один этот момент может быть интересен для некоторых .. (соблазнительно с комментариями! :)
Этот скрипт считает пустые строки пустыми, даже если они содержат пробелы.
Несколько пробелов в тексте сжаты в один пробел.
Конечный пробел удаляется из текстовых строк. Последовательные пустые строки свернуты в одну строку. Скрипт оставляет верхние и нижние пустые строки без изменений.
Для чего-то большего, чем самые простые скрипты, sed может быть написан гораздо проще в структурированной форме, как отдельный файл скрипта. Вот такой пример.
с использованием расширенного синтаксического
вызова регулярного выражения : $ sed -rf text-file script
Примечание:
flush
в комментариях означает: отправить шаблонное пространство внутренней обработке stdout sed. Это не означает определенный отпечаток на стандартный вывод. Выход зависит от-n
опции sed . например.q
команда означает флеш и не бросить ... Сравните эти два фрагмента:echo x |sed -e q
печатает й,echo x |sed -ne q
печатает ничего, в то время как с помощьюp
команды напечатает «х» дважды или один раз, в зависимости от-n
варианта.источник
Вот еще одно
sed
решение, которое объединяет все строки вsed
«пространство удержания», так что мы получаем одну длинную строку, которая в итоге копируется в «пространство образца» для сопоставления с образцом.Так как переводы строк будут сохраняться в последней длинной строке в
sed
«пространстве образца», пустые строки в терминах двойных разрывов строк[^\n]\n\n[^\n]
можно сопоставлять и изменять[^\n]\n[^\n]
.Для получения дополнительной информации см., Например, sed и Multi-Line Search and Replace .
источник
Это может быть старая школа:
Это выведет ваш текст выровненным по левому краю (
.ad l
) с длиной строки 80 (.ll 80
). Параметр длины страницы (.pl
) указывает текстовому процессору выполнять заполнение страницы для длины страницы 1, поэтому заполнение страницы не требуется.Если вы хотите, чтобы все ваши абзацы были в одной строке, вы можете использовать большое число для
.ll
:man 7 groff для большего количества вариантов форматирования.
источник
В Emacs я иногда использую это
regex
:Средства:
источник
Оказывается, с
auto-fill-mode
включенным, emacs делает довольно хорошую работу для моих простых сценариев использования с простоM-q
...источник
auto-fill-mode
действительно зависит от того, какой основной режим у вас активен.