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

Исходное сообщение
"sed, удаление строк"

Отправлено renton , 26-Авг-08 14:28 
Привет друзья.

Нужна ваша помощь по sed'у.

В тексте требуется удалить строки перед регулярным выражением и после, ну и само совпадение.
Удаление по рег. выражению, понятно, просто:
sed '/regexp/d'
но дальше, что-то никак.

Подозреваю, что нужно как-то воспользоваться командами x,h,b, но вот как их сюда прикрутить, непонятно.


Содержание

Сообщения в этом обсуждении
"sed, удаление строк"
Отправлено madskull , 26-Авг-08 16:43 
Прикольная задачка.
Сделал вот так
cat file| sed -n '/regexp/{g;s/\(.*\)\n.*/\1/;h;${b2};N;b1};H;:1;${:2;g;s/\n//;p}'

вроде правильно отрабатывает найденное и в первых и в последних строках.


"sed, удаление строк"
Отправлено renton , 26-Авг-08 17:17 
>cat file| sed -n '/regexp/{g;s/\(.*\)\n.*/\1/;h;${b2};N;b1};H;:1;${:2;g;s/\n//;p}'

Как обычно, круто!
Спасибо.

Если вас не затруднит объясните, пожалуйста, что тут sed делает со всеми этими командами.


"sed, удаление строк"
Отправлено madskull , 26-Авг-08 17:36 
>>cat file| sed -n '/regexp/{g;s/\(.*\)\n.*/\1/;h;${b2};N;b1};H;:1;${:2;g;s/\n//;p}'
>
>Как обычно, круто!
>Спасибо.
>
>Если вас не затруднит объясните, пожалуйста, что тут sed делает со всеми
>этими командами.

/regexp/{  # если встречается искомое
    g; s/\(.*\)\n.*/\1/; h  # достать из hold текст, отрезать последнюю строку (она предыдущая к искомой) и положить обратно
    ${b2}   #  если это последняя строка - к окончательной обработке текста
    N;b1  # скипаем следующую после искомой
}
H # все остальные строки - в hold
:1
${ # последняя строка - печатаем текст
    :2
    g; s/\n//; p # достаем, отрезаем первый (добавленный командой H) конец строки и печатаем
}  

see also: pinfo sed



"sed, удаление строк"
Отправлено Andrey Mitrofanov , 26-Авг-08 17:53 
>    g; s/\(.*\)\n.*/\1/; h  # достать из hold
>текст, отрезать последнюю строку (она предыдущая к искомой) и положить обратно

Ничего $) не понимаю в sed, но интересуюсь B^) ...
str1
str2
regexp 1
str3
regexp 2
str4
..."str1" не переживёт "катаклизма", задавленная regexp-ом #2 ? :)


"sed, удаление строк"
Отправлено madskull , 26-Авг-08 18:05 
>[оверквотинг удален]
>>текст, отрезать последнюю строку (она предыдущая к искомой) и положить обратно
>
>Ничего $) не понимаю в sed, но интересуюсь B^) ...
>str1
>str2
>regexp 1
>str3
>regexp 2
>str4
>..."str1" не переживёт "катаклизма", задавленная regexp-ом #2 ? :)

угу, никто не выживет


"sed, удаление строк"
Отправлено renton , 27-Авг-08 15:02 
>/regexp/{  # если встречается искомое ...

Кстати, я реально затупил.
У меня в тексте всегда одинаковые строки перед и после шаблона, т.е.

строка1
шаблон
строка2
blabla
blabla
...
строка1
шаблон
строка2

наверно можно было просто написать /строка1\nшаблон\nстрока2/d


"sed, удаление строк"
Отправлено madskull , 27-Авг-08 15:10 
>[оверквотинг удален]
>шаблон
>строка2
>blabla
>blabla
>...
>строка1
>шаблон
>строка2
>
>наверно можно было просто написать /строка1\nшаблон\nстрока2/d

Ничего, зато размялись.
А в этом случае подойдет sed '/строка1/,+2d'


"sed, удаление строк"
Отправлено Sparc , 19-Авг-10 14:47 
Доброго времени суток!

Есть задачка по sed-у(сам второй день бьюсь:)):

Есть файл с текстом примерно такого содержания:
_____________________________________________________________________________________
date,          time ,    name,   port,      ID,                IP                    
08/16/2010, 19:06:23, Door@3d<>$, 44, CORE_0.0:868311000, 195.189.249.58            
08/16/2010, 19:06:33, Door@3d<>$, 46, CORE_0.0:868311000, 195.189.249.58              
08/16/2010, 19:07:14, Door@3d<>$, 55, CORE_0.0:868311000, 195.189.249.58              
08/16/2010, 19:11:11, Door@3d<>$, 78, KERN_ID_LAN, 195.189.249.58                    
08/16/2010, 19:17:25, Ford, 90, KERN_ID_LAN, 195.191.13.6                            
08/16/2010, 19:19:11, Achilles, 95, KERN_ID_LAN, 195.140.228.30                      
08/16/2010, 19:44:08, Head, 167, CORE_ID_LAN, 195.135.237.20                          
08/16/2010, 19:06:33, Door@3d<>$, 46, CORE_0.0:868311000, 195.189.249.58              
08/16/2010, 19:07:14, Door@3d<>$, 55, CORE_0.0:868311000, 195.189.249.58              
08/16/2010, 19:11:11, Door@3d<>$, 78, CORE_0.0:868311000, 195.189.249.58              
08/16/2010, 19:45:14, Head, 1344, CORE_ID_LAN, 195.135.237.20                        
08/16/2010, 19:51:50, Head, 20322, CORE_ID_LAN, 195.135.237.20                        
08/16/2010, 19:06:33, Door@3d<>$, 46, CORE_0.0:868311000, 195.189.249.58              
08/16/2010, 19:07:14, Door@3d<>$, 55, CORE_0.0:868311000, 195.189.249.58              
08/16/2010, 20:07:42, Aux fgj&$FGf, 241, CORE_ID_LAN, 195.242.114.93                
08/16/2010, 20:09:58, Help!! pls!!, 251, CORE_ID_LAN, 195.242.114.93                  
08/16/2010, 20:14:20, Head, 254, CORE_ID_LAN, 195.135.237.21                        
08/16/2010, 20:18:50, dflkgjdfklg$%#$^, 265, CORE_0.0:51080034, 195.216.210.240      
08/16/2010, 19:07:14, Openeddoor, 55, CORE_0:0:868311000, 195.189.249.58            
08/16/2010, 19:07:14, Openeddoor, 55, CORE_0:0:868311000, 195.189.249.58              
08/16/2010, 19:07:14, Openeddoor, 55, CORE_0:0:868311000, 195.189.249.58              
08/16/2010, 19:11:11, ClosedDoor<>$, 78, CORE_0:0:868311000, 195.189.249.58          
_____________________________________________________________________________________|

примечание:
первой строки в файле нет, вписал для восприятия(это всё потом в БД пойдёт).
поля Date, Time, Port - различны во всех строках.
Name - любой набор символов.

задача:
Необходимо удалить, оставив только одну, повторяющиеся строки только с одинаковыми Name, ID, IP.
Эти строки могут идти не последовательно, а по всему тексту в разброс или пачками.

В идеале должно получиться примерно так:
_____________________________________________________________________________________
date,          time ,    name,   port,      ID,                IP                    
08/16/2010, 19:06:23, Door@3d<!>$, 44, CORE_0.0:868311000, 195.189.249.58            
08/16/2010, 19:11:11, Door@3d<>$, 78, KERN_ID_LAN, 195.189.249.58                    
08/16/2010, 19:17:25, Ford, 90, KERN_ID_LAN, 195.191.13.6                            
08/16/2010, 19:19:11, Achilles, 95, KERN_ID_LAN, 195.140.228.30                      
08/16/2010, 19:44:08, Head, 167, CORE_ID_LAN, 195.135.237.20                          
08/16/2010, 20:07:42, Aux fgj&$FGf, 241, CORE_ID_LAN, 195.242.114.93                  
08/16/2010, 20:09:58, Help!! pls!!, 251, CORE_ID_LAN, 195.242.114.93                  
08/16/2010, 20:14:20, Head, 254, CORE_ID_LAN, 195.135.237.21                          
08/16/2010, 20:18:50, dflkgjdfklg$%#$^, 265, CORE_0.0:51080034, 195.216.210.240      
08/16/2010, 19:07:14, Openeddoor, 55, CORE_0:0:868311000, 195.189.249.58              
08/16/2010, 19:11:11, ClosedDoor<>$, 78, CORE_0:0:868311000, 195.189.249.58          
_____________________________________________________________________________________|

Спасибо за помощь! :) :beer:


"sed, удаление строк"
Отправлено phpcoder , 19-Авг-10 15:06 
sort -t, -k3 -k5 -k6 in.txt | uniq -f1 -f2 -f4


"sed, удаление строк"
Отправлено SuN , 19-Авг-10 15:58 
>sort -t, -k3 -k5 -k6 in.txt | uniq -f1 -f2 -f4

http://www.opennet.ru/openforum/vsluhforumID9/8833.html - ссылка на основную тему