LINUX.ORG.RU

Sed: перечисление русских букв


0

2
03:38:39 tia-laptop ~
[ tia ] $ echo "Например, сохранение в записной книжке
нескольких сотен записей может привести к
полному использованию всей доступной памяти." | sed -e ':A;N;$!bA' -e 's/\([а-я]\)\n\([а-я]\)/\1 \2/g'
Например, сохранение в записной книжке
нескольких сотен записей может привести к
полному использованию всей доступной памяти.
03:38:47 tia-laptop ~
[ tia ] $ echo "Например, сохранение в записной книжке
нескольких сотен записей может привести к
полному использованию всей доступной памяти." | sed -e ':A;N;$!bA' -e 's/\([а-яе]\)\n\([а-яе]\)/\1 \2/g'
Например, сохранение в записной книжке нескольких сотен записей может привести к полному использованию всей доступной памяти.

Кто-нибудь может мне объяснить, что за магия с перечислением? Почему, если я указываю [а-я], то ничего не заменяется, а когда указываю [а-яе], то заменяются оба переноса строки?
//Локаль ru_RU.UTF-8

★★★★★

Во-первых, внезапно, но [а-я] != абвгде....эюя. Для таких целей есть [:upper:] и [:lower:].

Во-вторых, если цель удалить переносы строк, то это делается несколько проще при помощи tr.

adriano32 ★★★
()
Ответ на: комментарий от adriano32

Чему же эквивалентно [а-я]? Почему ни 'е', ни 'к' в [а-я] не входят, но входят в [а-яе]?

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

tiandrey ★★★★★
() автор топика

Во-первых, поведение sed может отличаться, собран ли он с системной библиотекой или используется gnulib. В Debian, кажется, были любители использовать gnulib.

Тут может корениться проблема, потому что gnulib, естественно, ничего не знает про системную локаль. А от локали и зависит, как интерпретировать [а-я], алфавиты-то у людей разные.

anarquista ★★★★★
()
Ответ на: комментарий от anarquista

Насколько я понимаю, [:upper:] и [:lower:] включают в себя строчные и, соответственно, заглавные буквы всех языков, а мне нужны только русские.

BTW

sys-apps/sed-4.2.1-r1  USE="acl nls (-selinux) -static"
никаких упоминаний gnulib не вижу

tiandrey ★★★★★
() автор топика

Может быть, тогда прямо их перечислить? абгдеж…

Почему не работает ваш вариант — не знаю. У меня всё работает. [а-я].

anarquista ★★★★★
()
Ответ на: комментарий от anarquista

>Может быть, тогда прямо их перечислить?

По итогу так и сделал. Всё же интересно, почему у меня не работает?

tiandrey ★★★★★
() автор топика
Ответ на: комментарий от tiandrey

Объяснить не смогу.

sed сам с регулярными выражениями не работает. Либо перекладывает это дело на системную библиотеку (glibc), если собран с ./configure --without-included-regex, либо на gnulib, если собран с --with-included-regex.

То, есть, в любом случае проблему нужно искать не в самом sed.

anarquista ★★★★★
()
Ответ на: комментарий от anarquista

Собрал с --without-included-regex, теперь нормально работает, спасибо. Про gnulib, кстати говоря, в configure не говорится, и для amd64 она замаскирована:

--without-included-regex

don't compile regex; this is the default on systems with recent-enough versions of the GNU C Library (use with caution on other systems)

tiandrey ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.