Как мне удалить все теги <script>(и все, что между ними) из нескольких файлов в UNIX? - PullRequest
2 голосов
/ 27 февраля 2010

У меня есть папка с несколькими файлами, и я хотел бы удалить все теги <script> и все между ними, например ::

Это:

<script type="text/javascript">function(foo);</script>

А также:

<script type="text/javascript" src="scripts.js"></script>

Я думаю, что в PHP это будет примерно так:

<?php $string = preg_replace('#(\n?<script[^>]*?>.*?</script[^>]*?>)|(\n?<script[^>]*?/>)#is', '', $string); ?>

Но я в недоумении, когда дело доходит до UNIX.

Ответы [ 5 ]

3 голосов
/ 27 февраля 2010

например gawk

$ cat file
blah
<script type="text/javascript">function(foo);</script>
<script type="text/javascript" src="scripts.js"></script>
blah
<script type="text/javascript"
    src="script1.js">
</script>
end

$ awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}' file
blah




blah


end

, поэтому запустите его внутри цикла for, чтобы просмотреть ваши файлы (например, html)

for file in *.html
do
  awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}' $file >temp
  mv temp $file
done

Вы также можете сделать это с Perl,

perl -i.bak -0777ne 's|<script.*?</script>||gms;print' *.html
2 голосов
/ 16 марта 2010

Я бы просто использовал что-то вроде HTML :: TreeBuilder и удалял все узлы SCRIPT, когда я бродил по дереву:

#!/usr/local/perls/perl-5.10.1/bin/perl

use 5.010;

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder->new;
my $root = $html->parse_file( *DATA );

my @queue = ( $root->elementify );

while( my $element = shift @queue )
    {
    foreach ( $element->content_list )
        {
        when ( ! ref ) { 1 }
        when ( $_->tag eq 'script' )
            {
            $_->delete;
            }
        default
            {
            push @queue, $_
            }
        }
    }

print $html->as_HTML;

__END__
<html>
<head>
    <title>This is a title</title>
    <script>
    code section 1
    </script>
</head>

<body>
<h1>This is a heading</h1>
    <script>
    code section 2
    </script>

<div>
    <script>
    code section 
    </script>
</div>

</body>
</html>
2 голосов
/ 27 февраля 2010

Единственный способ получить это право - загрузить файл (я полагаю, это файл HTML) в анализатор HTML / XML и таким образом удалить узлы сценария. Любой другой способ может привести к нарушению тега , содержащего "" как часть его содержимого, например:

<script>
    document.write('</script>');
</script>
0 голосов
/ 27 февраля 2010

хорошо, вы можете запустить PHP из командной строки или довольно легко перевести эту строку в perl («p» в «preg_replace»). Вы можете использовать sed, чтобы сделать что-то подобное, но регулярные выражения не так гибки. Регулярные выражения могут быть или не быть достаточно хорошими в зависимости от того, откуда поступает ваш вклад и какова ваша цель.

0 голосов
/ 27 февраля 2010

Вы можете использовать perl для замены строк во многих файлах.

perl -pi -w -e 's/search/replace/g;' *.html

-e means execute the following line of code.
-i means edit in-place
-w write warnings
-p loop

Вы должны придумать регулярное выражение для вашего хотя. (Тот, который у вас должен работать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...