LINUX.ORG.RU

Странное поведение sed

 ,


0

1
$ echo xà | sed 's%\(.\)\([a-z]\)%<\1><\2>%'
<x><Ã>

но

$ echo xà | sed 's%\([a-z]\)%<\1>%g'
<x>Ã
и
$ echo à | sed 's%\([a-z]\)%<\1>%'
Ã

Шо за фигня, посаны? Вообще не понимаю, почему оно ТАК работает в первом случае. Можно [a-z] везде заменить на [A-Z] - всё то же самое.

GNU sed 4.2.1

Update: glibc 2.15

echo xÃ

Проверь с LC_ALL= (или =С; например, у меня та же версия седа первый пример не воспроизводит), а то мало ли collate (или как он называется) сделан.

anonymous ()

Вот ещё странность:

echo xà | sed 's%\(.\)\([a-b]\)%<\1><\2>%'
<x><Ã>
однако
echo xà | sed 's%\(.\)\([a-a]\)%<\1><\2>%'
xÃ
и
echo xà | sed 's%\(.\)\([b-b]\)%<\1><\2>%'      
xÃ

discordia ()

Ладно, допустим, диапазоны символов типа [x-y] ведут себя по-другому в не-C локали.
Но тогда так же должны работать второй и третий примеры, не?
Есть здесь какая-то неконсистентность.

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

А с локалью ru_RU.UTF-8 - да.

У меня и с LANG=ru_RU.UTF-8 не воспроизвоится. GNU sed версия 4.2.1. GNU C Library stable release version 2.16, by Roland McGrath et al.

dexpl ★★★★★ ()

На Debian testing (eglibc 2.13) тоже не воспроизвелось.

anonymous ()

sed по умолчанию пропускает весь поток и изменяет строку, если есть что изменять. Чтобы показывать только строки, в которых sed отработал, man опцию -n и команду p.

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