подскажите как при помощи sed сделать copy-past целой строки в текстовом файле то есть например строку номер 3 вырезать и вставить перед шестой строкой
в вики вроде есть пример с копированием,но нет с перемещением
http://ru.wikipedia.org/wiki/Sed
"команда «скопировать строку 25 в строку 76» (25t76) "
> ... например строку номер 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
$
>[оверквотинг удален]
>line 2
>line 4
>line 5
>line 3
>line 6
>line 7
>line 8
>line 9
>line 10
>$
спасибо,но способ работает только в одну сторону? если переставлять строку с большим номером на место меньшей этот способ не работает
>этот способ не работаетПреподы теперь иждевенцев sed-ом мучают, или sed - Ваш Выбор?
>>этот способ не работает
>
>Преподы теперь иждевенцев sed-ом мучают, или sed - Ваш Выбор?выбор, к сожалению,поскольку оптимальней врядли чем получится.Но информация удивлению нстолько обширна,что найти в ней частности типа приведенной задачи малореально,куда ни сунься -одни готовые скрипты,разъяснений принципа работы и синтаксиса-ноль.
>выбор, к сожалению,поскольку оптимальней врядли чем получитсяЭто Вам препод сказал или Вы сами пришли к? Как, если не секрет?
Вот ещё один "оптимальный" инструмент:
$ 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,что скажете насчет опции
x -Exchange the contents of the hold and pattern spaces? может быть её как то можно использовать,вот только ума не приложу с какой стороны подлезть,меня в принципе ваш первый предложенный способ вполне устраивает, если бы он работал в любую сторону
Ничего лучше этого пока не приходит в голову (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