The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"использование sed"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Разное)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "использование sed"  +/
Сообщение от temny email(ok) on 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
$

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "использование sed"  +/
Сообщение от Andrey Mitrofanov on 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
$ _

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

7. "использование sed"  +/
Сообщение от temny email(ok) on 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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру