URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8858
[ Назад ]

Исходное сообщение
"использование sed"

Отправлено Лещенко , 17-Сен-10 21:37 
подскажите как  при помощи sed сделать copy-past целой строки в текстовом файле то есть например строку номер 3 вырезать и вставить перед шестой строкой
в вики вроде есть пример с копированием,но нет с перемещением
http://ru.wikipedia.org/wiki/Sed  
"команда «скопировать строку 25 в строку 76» (25t76) "

Содержание

Сообщения в этом обсуждении
"использование sed"
Отправлено temny , 17-Сен-10 22:00 
> ... например строку номер 3 вырезать и вставить перед шестой строкой

$ for i in {1..10}; do echo line $i; done | sed '3{h;d;};5G'
line 1
line 2
line 4
line 5
line 3
line 6
line 7
line 8
line 9
line 10
$


"использование sed"
Отправлено Лещенко , 20-Сен-10 13:42 
>[оверквотинг удален]
>line 2
>line 4
>line 5
>line 3
>line 6
>line 7
>line 8
>line 9
>line 10
>$

спасибо,но способ работает только в одну сторону? если переставлять строку с большим номером  на место меньшей этот способ не работает


"использование sed"
Отправлено Andrey Mitrofanov , 20-Сен-10 14:25 
>этот способ не работает

Преподы теперь иждевенцев sed-ом мучают, или sed - Ваш Выбор?


"использование sed"
Отправлено Лещенко , 20-Сен-10 15:05 
>>этот способ не работает
>
>Преподы теперь иждевенцев sed-ом мучают, или sed - Ваш Выбор?

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


"использование sed"
Отправлено Andrey Mitrofanov , 20-Сен-10 15:34 
>выбор, к сожалению,поскольку оптимальней врядли чем получится

Это Вам препод сказал или Вы сами пришли к? Как, если не секрет?

Вот ещё один "оптимальный" инструмент:

$ seq 1 10 >file10
$ echo -e "5m3\n1,\$p\nQ\n"|ed -s file10
1
2
3
5
4
6
7
8
9
10
$ echo -e "3m5\n1,\$p\nQ\n"|ed -s file10
1
2
4
5
3
6
7
8
9
10
$ _


"использование sed"
Отправлено Лещенко , 20-Сен-10 16:00 
спасибо конечно,но этот способ я уже пробовал-нужен sed,что скажете насчет опции
x  -Exchange the contents of the hold and pattern spaces? может быть её как то можно использовать,вот только ума не приложу с какой стороны подлезть,меня в принципе ваш первый предложенный способ вполне устраивает, если бы он  работал в любую сторону  

"использование sed"
Отправлено temny , 20-Сен-10 18:56 
Ничего лучше этого пока не приходит в голову (a = какую строку "взять"; b = на какую строку "переставить"):
$ a=3; b=9; for i in {1..10}; do echo line $i; done | sed $a'p;H;$!d;${x;ss.ss;}' | sed '1{x;d;};'$((b+1+(b>a)))'{x;p;x;};'$((a+1))d';${'$((b+1))'{p;x;};}'
line 1
line 2
line 4
line 5
line 6
line 7
line 8
line 9
line 3
line 10
$ a=9; b=3; for i in {1..10}; do echo line $i; done | sed $a'p;H;$!d;${x;ss.ss;}' | sed '1{x;d;};'$((b+1+(b>a)))'{x;p;x;};'$((a+1))d';${'$((b+1))'{p;x;};}'
line 1
line 2
line 9
line 3
line 4
line 5
line 6
line 7
line 8
line 10

Крайние условия:

$ a=1; b=10; for i in {1..10}; do echo line $i; done | sed $a'p;H;$!d;${x;ss.ss;}' | sed '1{x;d;};'$((b+1+(b>a)))'{x;p;x;};'$((a+1))d';${'$((b+1))'{p;x;};}'
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
line 1
$ a=10; b=1; for i in {1..10}; do echo line $i; done | sed $a'p;H;$!d;${x;ss.ss;}' | sed '1{x;d;};'$((b+1+(b>a)))'{x;p;x;};'$((a+1))d';${'$((b+1))'{p;x;};}'
line 10
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9

минусы этого решения:
- два прохода sed-ом;
- удерживание в hold space всего объёма данных (в первом sed) - т.е. для больших объёмов данных вариант не лучший;
- уверен, что можно найти более простое/красивое решение на sed