`

СПЕЦИАЛЬНЫЕ
ПАРТНЕРЫ
ПРОЕКТА

Архив номеров

Как изменилось финансирование ИТ-направления в вашей организации?

Best CIO

Определение наиболее профессиональных ИТ-управленцев, лидеров и экспертов в своих отраслях

Человек года

Кто внес наибольший вклад в развитие украинского ИТ-рынка.

Продукт года

Награды «Продукт года» еженедельника «Компьютерное обозрение» за наиболее выдающиеся ИТ-товары

 

Андрей Зубинский

Поворчу

+99
голосов

Задумал вчера почитать книгу. Хорошую. Михаила Успенского. Благо, на lib.ru она есть. Но читать с экрана браузера я не люблю. Для чтения есть более подходящие программы.

У текстов на lib.ru есть одна особенность. Форматирование. Переводы строки ставятся не в конце абзаца, а так, чтобы строка "попадала" в формат алфавитно-цифрового терминала. Посему я текст очищаю от разметки и объединяют строки, сохраняя переводы строки только в конце абзацев. Делаю это, естественно, не вручную, а текстовым редактором, поиском-заменой с использованием регулярных выражений. Скажем, html-разметку легко удалить заменой <[^>]+> на ничто. А, благодаря специфике разметки строк и абзацев, соединить строки и сохранить структуру текста в абзацах можно одной операцией замены \n([^\s]) на пробел и найденное то, что в скобках (чаще всего в регулярных выражениях это обозначается \1). Впрочем, это несущественные нюансы. Потому что не о них речь.

Итак, запустил я Notepad++. Это, пожалуй, самый популярный open source текстовый редактор для Windows. Пользовательская аудитория у него - тьма-тьмущая. Проект с долгой историей. Тривиальное (очитка от разметки) - всё ок. А вот с переводом строки вышел конфуз. Не понимают регулярные выражения Notepad++ символ \n. Только расширенный поиск понимает. Но в расширенном поиске нельзя пользоваться найденным во вставке. Так это ещё не всё. И явного задания символа перевода строки, ни \x0A при ANSI-кодировке текста, ни \x0A00, Notepad++ тоже не понимает.

Ладно, это известное ограничение (как оказалось). Набираю в гугле "best freeware plain text editor" и вот тут начинаются взрослые танцы. Ставлю редакторы, понимающие регулярные выражения, один за другим. И у всех одна и та же особенность. С переводом строки.

Иными словами, mission impossible (я уже молчу про замену нескольких подряд переводов строки одним - это суперзадача из мира аэкрокосмических технологий).

Как я себе понимаю, виновник всего этого веселья - реализация библиотеки regexp, которую пользуют все "потому что она хорошая". Хорошая-то она хорошая, но вот не позволяет решить простейшую совершенно законную правильно сформулированную задачу. Откуда растут ноги этой проблемы - понятно. Код regexp-библиотеки писался когда-то давно в Unix (точнее, в Linux, потому что это GNU-код), потом многократно адаптировался.

Тут вспоминаю о Java. В Java унаследованных проблем с текстом быть не должно. Вспоминаю редактор jEdit. Он на вид неказистый, но. Ставлю его и тремя действиями (первое - уточняю в документации синтаксис регулярных выражений) делаю то, что все редакторы, использующие злополучную regexp библиотеку, вынуждали меня делять руками. А именно - удалять в тексте из 3642 строк символы перевода строк так, чтобы не терялись абзацы.

Так вот это всё я вот к чему банальному невыносимо - какая бы ни была пользовательская аудитория у программы, сколь бы ни была популярна программа, какие восторженные отзывы о ней не писали бы адепты, всё это нисколько не означает что вашу конкретную задачу можно решить с помощью этой программы. Хоть бы задача была и абсолютно корректна и элементарна. Это факт. Который, кстати, заставляет с громадным уважением относиться к разработчикам по-настоящему больших программных пакетов, умудряющихся создавать хорошо работающие при решении широких классов задач инструменты.

И ещё об одном очевидном. Когда-то давно я осмелился сказать, что клоны ОС Unix - это в том числе и оружие, ослабляющее позиции самой ОС Unix и потому расчищающее рынок для конкурирующих систем (в первую очередь, серверных ОС Microsoft). Чем вызвал возбуждение и возмущение в рядах пламенных борцов за осовобождение не знаю кого от не знаю чего. Но вот время прошло, освобождения так и не наступило, а IDC опубликовала отчёт о рынке серверов во втором квартале этого года. И что мы из него видим? А видим мы из него (по сравнению со вторым кварталом 2009 г.) 35,3% рост объёмов продаж Windows-серверов на фоне 7,2% спада продаж Unix-серверов и 30% роста Linux-сектора. Если же смотреть в денежном эквиваленте, то картина ещё интереснее - 5 млрд. продаж серверов с Windows, 2,9 млрд - с Unix и всего 1,8 млрд - с Linux. Эти денежки, вопреки вере пламенных борцов, тратятся не только на мерседесы для менеджеров среднего звена. А ещё и на R&D, на работы по сопровождению ПО и т.д. Короче говоря, кто их больше тратит на это всё - тот дальше убегает вперёд.

Такие примерно дела. Ссылки на то, что можно найти гуглем одним движением, не ставил.

+99
голосов

Напечатать Отправить другу

Читайте также

В Tcl/Tk работает: regsub -all {\n([^\s])} $s { \1} s2
Это, конечно, не редактор, но та же библиотека regexp.

я знаю за тикловую библиотеку regexp.
она не та же.
вовсе не та же.
Tcl's regex engine is a true hybrid, custom built by Henry Spencer (whom you may remember having played an important part in the early development and popularization of regular expression).

Если я правильно помню, проблема не в этом.
Regexp (еще когда задумывался) работает со СТРОКАМИ. А .+\n.+ - это ДВЕ стороки (минимум :) ). Поэтому во всех (нормальных) RegExp'илках (проверено в ed, Perl, FAR) есть опция multiline replace (s/../../m), которая, ессно, по умолчанию не включена :)

Ряд источников (в т.ч. Wikipedia) квотит поддержку в notepad++ плагина для "Multiline Regular Expressions Search and Replace". Пример: http://notepad17.software.informer.com/wiki/
Вот тут есть какая-то таблица, с которой можно поразбираться: http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Searc...
Так что, видимо, проблема, решается. Когда найдете плагин - дайте знать, вдруг и другим пригодится :)

P.S. Что самое интересное - если отключить regexp - большинство редакторов понимают и \n и \m :)

Гораздо меньше порадовало это: http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Unsup...
Надо искать плагин для np++, который реализует Perl-style regex

увы, в большинство редакторов regexp встроена намертво, плагины тут не помогут.

на самом деле для regexp не должно быть никаких строк, только последовательность символов, как печатных, так и непечатных - это же очевидно.

в общем, jEdit делает то, что должен делать, и делает это хорошо. и этого достаточно, я считаю. всегда лучше быть здоровым изначально, чем успешно лечиться от хронических болезеней, хехе

Я обычно конвертирую тексты с lib.ru в fb2 программой типа any2fb2. И никаких проблем с переводами строк :)

стараюсь не плодить сущности без необходимости, а fb2 мне в этом случае без нужды совершенно.

Простите, а из какой программы Вы читаете? Просто все читалки электронных книг которыми я пользуюсь лучше всего понимают fb2.

Linux is like a wigwam - no windows, no gates, aрache inside!

Рекомендую попробовать Sublime Text. Это платный редактор, но у него есть неограниченное demo и, пожалуй, это лучшее что я видел за последний год.

Только что проверил, замену нескольких переносов с помощью regexp-а он отлично выполнил.

о, спасибо, действительно - прекрасный редактор.
уже проверил.
наконец-то.
спасибо

да уж, как люди на собой только не издеваются чтобы имаксом не пользоваться.

Вы очень неправы в ворчании. Если нужно обработать поток - напримпер, склеить строки - в unix есть tr - им можно поменять переводы строк на "что-то ещё". regexp вообще-то больше для grep/sed нужна. (perl regexp - в принципе "отдельный разговор"). Хотя задача поменять "что-то ещё" на переводы строк - тоже весёлой бывает.

Довольно типично что-нить такое бывает:

for i in `cat somefile`
do
blah-blah $i|sed '....'|...
done

Скорее, разработчики редакторов "ленивы-неправы", что использовали стандартную библиотеку regexp, но хотеть, чтоб именно она работала с потоком, а не строкой - неправильно в принципе. Это как хотеть, чтоб микроскоп можно было и как телескоп, и как молоток использовать с равной эффективностью. Возможно, стоило бы в ней предусмотреть что "у нас разделитель строки - вот такой, а не перевод строки".

И вообще - в MS Word была чудная вешь - конвертор "текст с форматированием" - не знаю, дожила ли... А ещё когда-то я на MSWord VB написал по сути то же самое...

я знаю за tr примерно с эээ... восемьдесят какого-то там года, когда впервые развернул МОС ЕС на ЕС 1061.
но tr здесь ровным счётом не при чём.
и regexp не для grep вовсе.
точнее, в той же степени она для grep, в какой библиотека ввода-вывода C - тоже для grep.
tr видит текст по-своему, regexp - по-своему, в *nix это нормально, когда одна и та же по сути сущность разными утилитами видится по-своему. в этом есть свои прелести и недостатки.
но реализация от этого всего не должна страдать.
ничуть.

в комментах привели пример современного редактора, прекрасного, на мой взгляд, который не страдает этой болячкой. а это болячка. без малейшего сомнения. причём кочующая и долгая.

word умеет регулярные выражения (правда, специфического синтаксиса из-за расширенной семантики, включающей и это самое форматирование), и, само собой, им это сделать можно (и делал не раз).
но как-то plain text грузить в мощный текстовый процессор, чтобы иметь возможность сделать то, чего нельзя сделать в текстовом редакторе - это, по-моему, моветон.
впрочем, в какой-то мере объясняющий доминирование майкрософт.

Кстати да. Несколько раз делал поиск и замену через Word - когда была лень настраивать Perl или .NET

редактор VS2008 прекрасно справився з задачею (тільки < і > - спецсимволи, тому вираз <[^>]+> перетворвися в \<[^>]+\> )
хіхі

Far+ReSearch :)))

я ненавижу фар!

ггг

В своё время из-за этой проблемы начал использовать gnu utils и Vim на Windows. Мой любимый редактор - PsPad страдал именно этим.
___________________________________
Twitter: @valbudkin

Для книг с lib.ru использовал WinMakezTxT.
Ее возможностей, как по мне, вполне достаточно. Простенько и со вкусом.

оО Он же генерит тексты для Palm. Неужели кто-то читает ЭТО на компьютере?

Выходной формат можно задать TXT.
Т.е. используем его не для конвертации, а только для форматирования.

 
 
IDC
Реклама

  •  Home  •  Рынок  •  ИТ-директор  •  CloudComputing  •  Hard  •  Soft  •  Сети  •  Безопасность  •  Наука  •  IoT