вот в этом посте http://linuxforum.ru/viewtopic.php?pid=135080#p135080 применён страшный код:
sed -rn '
s/.*/\n&\n/
:l
s/\n(.)(.*)(.)\n/\3\n\2\n\1/
t l
s/\n//g
p'
его не я придумал, а прочитал о нём в info sed. вот по-русски: http://drbatty.ru/sed/ch07.html
Инверсия порядка символов в строке.
Этот скрипт меняет последовательность символов в строке на противоположную, например
[console]$ echo "ABCDEFGHJ" | ./reverseline.sed
JHGFEDCBA
[/console]
Пример 7.6.
#!/usr/bin/sed -rf
# если в строку нет 2х символов (иначе, длинна строки меньше двух),
# то ничего не делаем
/../! b
# Реверс строки
# сначала в начало и в конец строки добавляются символы \n.
s/^.*$/\
&\
/
# Обмен первого и последнего символа местами, символы меняются
# вместе с маркёрами \n, причём относительный порядок символа и маркёра
# не меняется. Поэтому маркёры оказываются "внутри" - например:
# \n F .* E \n --- до замены
# E \n .* \n F --- после
# Цикл продолжается пока внутри не останется 1 или 0 символов.
tx
:x
s/(\n.)(.*)(.\n)/\3\2\1/
tx
# Удаление маркёров.
s/\n//g
да, код слегка изменён, ибо идею я помнил, а читать свой-же перевод мне было лениво ;)
ЗЫЖ у меня тут ошибочка - я не сбросил флаг перехода (а в info sed всё правильно). только это не страшно - в первый раз переход выполняется ВСЕГДА. потому если у нас например менять нечего (реверс строки "Z"), то программа пытается осуществить реверс ДВА раза, хотя достаточно одного. но это не страшно. оба раза команда s НЕ выполняется. ;)