Ваш вопрос немного слишком универсален здесь.
Пример:
sed 's/..\(.*\(..\)\)/\2\1/'
Заменил бы первые два символа каждой строки с двумя последними (только если существует по крайней мере 4 символа на тех строках).
$ echo abcdef | sed 's/..\(.*\(..\)\)/\2\1/'
efcdef
Прием должен использовать \(...\)
получать, что подбирается и использует его в сменной детали как \1
, \2
...
(это было из беглого взгляда несколько месяцев назад, пока этот патч не заставит вас двигаться, я не могу гарантировать, что он правильный. Применяйте заплатку [1188626]-l[1188627]).
Также обратите внимание, что [1188628]/dev/urandom[1188629] обеспечивает поток [1188630]байт[1188631]. В UTF-8 не все последовательности байтов сопоставляются с действительными символами. Например, 0x41 0x81 0x41 не является действительным, так как [1188632]0x81[1188633] составляет [1188634]>=[1188635] 0x80, поэтому он может возникать только в последовательности размером 2 или более байтов более 0x80.
Недействительный байт, так как он не входит в набор символов, который является дополнением к ☠, не будет удален с помощью [1188636]tr[1188637].
Лучше было бы:
ucs-2, будучи символами от U+0000 до U+FFFF, закодированными по 2 байта на символ, [1188638]/dev/urandom[1188639] больше похоже на поток символов ucs-2. (хотя нам не хватает символов от U+10000 до U+10FFFF)
Но это все равно включало бы диапазон суррогатных пар [1188640]D800...DFFF[1188641]. которая [1188642]mbrtowc(3)[1188643] задохнется (по крайней мере, в моей версии libc).
Эта точка кода зарезервирована для кодировки UTF-16. d800dc00, например, это кодировка UTF-16BE для U+10000, но нет ни символа U+D800, ни символа U+DC00. Кодировка UTF-8 тоже не имеет смысла как символ (даже если она смежная).
Length Date Time Name
--------- ---------- ----- ----
23 2011-07-12 14:10 asd.txt
--------- -------
23 1 file
Поэтому сначала нужно их исключить:
Если нужно получить поток случайных символов Юникода в кодировке UTF-8, то лучше всего получить случайную точку кода в допустимом диапазоне (0...0xd7ff, 0xf000...0x10ff) и преобразовать ее в UTF-8. Если вы хотите основываться на [1188644]/dev/urandom[1188645], то для каждой точки кода можно использовать 3 байта (24 бита):