bash sed - как удалить все теги скрипта из html файла - PullRequest
0 голосов
/ 28 сентября 2018

как удалить все теги скрипта в html-файле с помощью sed

Я пытаюсь с этим, но не работает, приведенная ниже команда не удаляет тег скрипта из test1.html (почему?)

$  sed -e 's/<script[.]+<\/script>//g' test1.html > test1_output.html

Моя цель - от test1.html до test1_output.html

test1.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>My Website</h1>

        <div class="row">
            some text
        </div>

        <script  type="text/javascript"> utmx( 'url', 'A/B' );</script>

        <script src="ga_exp.js" type="text/javascript" charset="utf-8"></script>

        <script type="text/javascript">
            window.exp_version = 'control';
        </script>

    </body>
</html>                                                                               

test1_output.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>My Website</h1>

        <div class="row">
            some text
        </div>

    </body>
</html>                                                                               

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

Если я правильно понял ваш вопрос, и вы хотите удалить все внутри <script></script>, я думаю, что вам нужно разделить sed на части (Вы можете сделать это одной строкой;):

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

sed 's/<script>.*<\/script>//g;/<script>/,/<\/script>/{/<script>/!{/<\/script>/!d}};s/<script>.*//g;s/.*<\/script>//g'

Первый кусок (s/<script>.*<\/script>//g) будет работать для них, когда в одной строке;

Второй раздел (/<script>/,/<\/script>/{/<script>/!{/<\/script>/!d}}) - это почти цитата к ответу @akingokay,Единственное, что я исключил линии вхождения (на всякий случай, если у них есть что-то до или после).Отличное объяснение этого здесь Использование sed для удаления всех строк между двумя соответствующими шаблонами ;

Последние два (s/<script>.*//g и s/.*<\/script>//g) наконец-то позаботятся о строках, которые начинаются ине заканчивайте или не начинайте и не заканчивайте.

Теперь, если у вас есть index.html, который имеет:

<html>
  <body>
        foo
        <script> console.log("bar) </script>
  <div id="something"></div>
        <script>
                // Multiple Lines script
                // Blah blah
        </script>
        foo <script> //Some
        console.log("script")</script> bar
  </body>
</html>

, и вы запустите эту команду sed, вы получите:

cat index.html | sed 's/<script>.*<\/script>//g;/<script>/,/<\/script>/{/<script>/!{/<\/script>/!d}};s/<script>.*//g;s/.*<\/script>//g'
<html>
  <body>
    foo


        <div id="something"></div>




    foo 
 bar
  </body>

</html>

Наконец, у вас будет много пустых мест, но код должен работать так, как ожидалось.Конечно, вы также можете легко удалить их с помощью sed.

Надеюсь, это поможет.

PS: Я думаю, что @ l0b0 - это правильно, и это не правильный инструмент.

0 голосов
/ 28 сентября 2018

Это будет работать:

sed 's/<script>//;s/<\/script>//' test1.html

Это выражение ищет в тексте подстроки <script> и </script> и заменяет их ничем, поэтому оно удаляется:)

0 голосов
/ 28 сентября 2018

sed - неправильный инструмент для этого:

Не пытайтесь выполнить это с помощью sed, awk, grep и т. Д. (Itприводит к нежелательным результатам).Во многих случаях ваш лучший вариант - писать на языке, поддерживающем данные XML.Если вам нужно использовать сценарий оболочки, есть несколько инструментов, специфичных для HTML и XML, для анализа этих файлов за вас.

Посмотрите на pup или xsltproc для обработки любого HTML-кода на оболочке.

0 голосов
/ 28 сентября 2018

Вы можете протестировать такие утилиты онлайн, например, на http://rextester.com/l/bash_online_compiler.

echo 'abc <script> def </script> xyz' | sed "/<script/,/<\/script>/d"

Выход = abc и xyz

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