Как удалить контент между текстом? - PullRequest
1 голос
/ 01 апреля 2019

Я хочу удалить все <scripts> во всех html-файлах во всех подпапках. Я не могу найти правильную версию линии

регулярное выражение: <script[\w\W]*?</script>

вот как это выглядит в строке по моим причинам:

find . -type f -name «*.html» -exec sed -i 's/<script[\w\W]*?</script>//g' {} \;

Я также пробовал это на каждом показе до: \<script\[\\w\\W\]\*\?\<\/script\>

это не работает

Есть еще один вариант

find -type f -name \*.html | xargs sed -i '/\<script/,/\<\/script\>/c\ '

но удаляет все содержимое страницы от первого скрипта до последнего. Все что мне нужно удалить только <script ....</script>

Может быть, grep может это сделать?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2019

Пример файла:

$ more input.html 
<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <p id="example"></p>
    <script>
      document.getElementById("example").innerHTML = "My first JavaScript code";
    </script>
  </body>
</html>

Пример таблицы стилей:

$ more removescript.xsl 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">

    <xsl:output method="html" encoding="utf-8" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//script" />

</xsl:stylesheet>

Команда:

$ xsltproc --html removescript.xsl input.html 
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <p id="example"/>

  </body>
</html>

Пояснения:

Таблица стилей будет копировать каждый отдельный узел и атрибут, при совпадении с узлом <script> </script> ничего не будет делать (без копирования), поэтому этиузлы будут удалены в результате.

2 голосов
/ 01 апреля 2019

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

В случае парсинга XML или HTML можно легко использовать xmlstarlet.

xmlstarlet ed -d '//script'

Однако, поскольку HTML-страницы часто не являются правильно сформированным XML, может быть удобно немного его очистить, используя tidy.В приведенном выше примере это дает:

$ tidy -q -numeric -asxhtml --show-warnings no <file.html> \
  | xmlstarlet ed -N "x=http://www.w3.org/1999/xhtml" \
               -d '//script'

, где -N дает пространство имен XHTML, если оно есть, это распознается

<html xmlns="http://www.w3.org/1999/xhtml">

В выводе XHTML tidy.

0 голосов
/ 02 апреля 2019

Я нашел простое решение:

find . -type f -name "*.html" -exec perl -0 -i -pe 's/<script.*?script>//gs' {} \;

...