Использование Grep, Sed [проблемы решены] (:))

Модератор: Модераторы разделов

satptz
Сообщения: 8

Использование Grep, Sed [проблемы решены]

Сообщение satptz »

Здравствуйте.
Есть множество файлов.
В них есть кусок текста\кода, ограниченный <!-- ad --> и <!-- /ad -->.
Мне надо его удалить.
Делаю так:
find . -name "*.php" | grep ad - выдает кучу ненужного мусора.
find . -name "*.php" | grep " ad " - не выдает ничего.

Подскажите, как составить команду, чтобы найти все файлы, содержащие <!-- ad --> (или <!-- /ad -->).

Заранее спасибо.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Использование Grep, Sed [проблемы решены]

Сообщение diesel »

Код: Выделить всё

grep -irE '<!-- \/?ad -->' .

Код: Выделить всё

grep -lirE '<!-- \/?ad -->' .

?
Спасибо сказали:
satptz
Сообщения: 8

Re: Использование Grep, Sed [проблемы решены]

Сообщение satptz »

Первая конструкция:
[******@web17 ~/********.nichost.ru/docs]$ find . -name "*.php" | grep -LirE '<!-- \/?ad -->'
(standard input)


Вторая:
[******@web17 ~/********.nichost.ru/docs]$ find . -name "*.php" | grep -irE '<!-- \/?ad -->'

Безуспешно.

Мне достаточно было бы даже поиска по "<!--" или "-->".
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Использование Grep, Sed [проблемы решены]

Сообщение diesel »

find не нужно писать :)
просто скопируй то что я написал и запусти.
Спасибо сказали:
satptz
Сообщения: 8

Re: Использование Grep, Sed [проблемы решены]

Сообщение satptz »

В таком случае, оболочка как будто ждёт ввода - курсор в начале новой строки.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Использование Grep, Sed [проблемы решены]

Сообщение diesel »

satptz писал(а):
19.03.2009 18:31
В таком случае, оболочка как будто ждёт ввода - курсор в начале новой строки.

скопируй все что я написал,
Hint: точку тоже...
Спасибо сказали:
satptz
Сообщения: 8

Re: Использование Grep, Sed [проблемы решены]

Сообщение satptz »

**Стыдится

Спасибо, diesel, большое :)

Думаю теперь, имея список файлов, я смогу скриптом вырезать найденные конструкции и то, что между ними. Если не справлюсь, то отпишу.
Спасибо сказали:
satptz
Сообщения: 8

Re: Использование Grep, Sed [проблемы решены]

Сообщение satptz »

Вобщем, не получается удалять <!-- ad -->, <!-- /ad --> и содержимое между ними. Пришел вот к чему (и всяким вариациям вокруг этого):

Код:

******@ssh:~$ cat 1.php | sed '/<!--.\/ad -->'/d'


Помогите, пожалуйста.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Использование Grep, Sed [проблемы решены]

Сообщение diesel »

вопрос: эти штуки всегда на одной строчке? то есть допустим только вот так:

Код: Выделить всё

<!-- ad --!> blablabla <!-- /ad --!>


или же возможны варианты типа

Код: Выделить всё

<!-- ad --!>
bla-bla-bla
<!-- /ad --!>

или вот так:
blabla1 <!-- ad --!> blabla2 <!-- /ad --> blabla3

и нужно удалить только выделенное?

короче пару примеров не помешает.

Относительно:

Код: Выделить всё

cat 1.php | sed '/<!--.\/ad -->'/d'

точка в <!--. означает что за -- будет следовать что-нить еще а потом /ad, это точно так? кавычка после --> поставит в тупик sed, поскольку он не видит продолжения команды.... а последняя кавычка поставит в тупик bash, поскольку bash захочет еще одну.
Спасибо сказали:
satptz
Сообщения: 8

Re: Использование Grep, Sed [проблемы решены]

Сообщение satptz »

diesel, спасибо, что помогаешь!


Если я не ошибаюсь, то сегодня видел даже такой вариант:

[важный код]<!-- ad --!>
bla-bla-bla
<!-- /ad --!>[важный код]


Только-только, еще горячая, из под клавиш вылезла такая штука:
satana@ssh:~$ cat 1.php | sed 's/<!-- ad -->.*//' | sed 's/else.*->//'


Изначально, например, так:

Код: Выделить всё

satana@ssh:~$ cat 1.php
<html><head><meta http-equiv="refresh" content="0;URL=../../"><head>
<body bgcolor="#FFFFFF"><!-- ad --><script>строчка1
       elseстрочка2</SCRIPT><!-- /ad --></body>
        </html>


А получается так.

Код: Выделить всё

satana@ssh:~$ cat 1.php | sed 's/<!-- ad -->.*//' | sed 's/else.*->//'
<html><head><meta http-equiv="refresh" content="0;URL=../../"><head>
<body bgcolor="#FFFFFF">
        </body>
        </html>satana@ssh:~$


Вобщем, пока вопросов нет. Пойду тестить на других файлах.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Использование Grep, Sed [проблемы решены]

Сообщение Folderx »

Код: Выделить всё

[guest@station tmp]$ cat text
<html><head><meta http-equiv="refresh" content="0;URL=../../"><head>
<body bgcolor="#FFFFFF"><!-- ad --><script>строчка1
elseстрочка2</SCRIPT><!-- /ad --></body>
[guest@station tmp]$ cat text | sed "s/<\!-- ad -->//g" | sed "s/<\!-- \/ad -->//g"
<html><head><meta http-equiv="refresh" content="0;URL=../../"><head>
<body bgcolor="#FFFFFF"><script>строчка1
elseстрочка2</SCRIPT></body>
</html>
[guest@station tmp]$
Спасибо сказали:
satptz
Сообщения: 8

Re: Использование Grep, Sed [проблемы решены]

Сообщение satptz »

Folderx, не. Надо удалить и эти теги и содержимое внутри их. Впрочем, решено всё. Вот такой вот строкой в баше. В *.sh у меня непонятно почему не получилось сделать, вылазили абсолютно левые файлы после команды grep.

Код: Выделить всё

[superhost@web17 ~/superhost.nichost.ru/docs]$ grep -lirE '<!-- \/?ad -->' . | while read; do cat $REPLY | sed 's/<!-- ad -->.*//' | sed 's/else.*->//' > $REPLY'1'; rm $REPLY;cp $REPLY'1' $REPLY;rm $REPLY'1';done


Дико извиняюсь за растянутую страницу.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Использование Grep, Sed [проблемы решены]

Сообщение diesel »

возможно в этих файлах тоже есть что-то подобное. запустите grep -irE --color 'шо ищим' и он подсветит совпадение то что нашел в этом файле.


Обратите внимание на ключик sed'а -i: smth like:

Код: Выделить всё

sed -i -r -e 's/что заменяем/куда заменяем/g' "$filename"

сделает замену в файле, и не надо будеть делать mv, если хочется оставить бэкапы,

Код: Выделить всё

  sed -i.bak -r -e 's/что заменяем/куда заменяем/g' "$filename"

положит бэкап для замененого файла в "${filename}.bak"
если в sed'е нет такого ключа, но есть perl:

Код: Выделить всё

  perl -i.bak -p -e 's/что заменяем/куда заменяем/g' "$filename"


по поводу строчки:

Код: Выделить всё

grep -lirE '<!-- \/?ad -->' . | while read; do cat $REPLY

while read REPLY; do ....
Спасибо сказали:
satptz
Сообщения: 8

Re: Использование Grep, Sed [проблемы решены]

Сообщение satptz »

В том то и дело, что при скрипте, записанном в *.sh вылазили, и картинки, и *.js, вобщем, всякие разные файлы. Я ручками проверил несколько файлов и ничего не нашел. Да и угрозы такие файлы не представляют, по идее.
А, если бы туда было что-то прописано левое (как <ad>), то рисунки, например, не должны были бы отображаться или не отображались правильно.

А в скрипте из командной строки эти "левые" файлы не вылазили. Хотя инструкции были совершенно одинаковые (проверял раз 10, думал меня глючит). Связываю это с какой-нибудь особенностью bash'а.

Бекапы как раз не надо делать. Sed не смог перезаписать файл: либо полностью его очищал (| > filename), либо дописывал в конец (| >> filename). Просто не нашел более легкого способа чтобы, записывать "очищенный" вывод. Дольше, некрасиво, но я и не претендую. Главное, что сработало =)
Спасибо сказали: