Удалите пробелы вокруг указанных тегов c в файле html в оболочке - PullRequest
0 голосов
/ 04 марта 2020

Я хочу написать сценарий оболочки, который минимизирует html файлов, но у меня проблема.

Я хотел бы удалить пробел с каждой стороны указанного тега c html, эти теги читаются из файла. С "perl" я не могу этого сделать, ничего не происходит, с помощью sed в 2 командах я почти получаю то, что хочу. В приведенном ниже примере пробел между некоторыми тегами удален, но не все, на уровне тегов «section» есть проблема, тоже «h2», однако шаблон соответствует ...

for tag in $tag_file ; do 
    #   perl -e '$comHtml=<>; $comHtml=~s/ *(<${tag} *.* *>) */\1/g; print $comHtml' < tmp_html
    sed -i -r -e "s: *(<${tag} *.* *>) *:\1:gI" ./tmp_html
    sed -i -r -e "s: *(</${tag} *.* *>) *:\1:gI" ./tmp_html
    done

здесь $ tag_file содержит указанный тег c, полученный из файла, например, $ tag_file = html \ n head \ n section \ n ...

Entry html:

<!doctype html> <html lang="fr"> <head> <meta charset="UTF-8"> <title>La gazette de L-INFO</title> <link rel="stylesheet" type="text/css" href="./styles/gazette.css"> </head> <body> <nav> <ul> <li><a href="#">Accueil</a></li> <li><a href="./html/actus.html">Toute l'actu</a></li> <li><a href="./php/recherche.php">Recherche</a></li> <li><a href="./html/redaction.html">La rédac'</a></li> <li><a href="#">jbigoude</a> <ul> <li><a href="./php/compte.php">Mon profil</a></li> <li><a href="./php/nouveau.php">Nouvel article</a></li> <li><a href="./php/deconnexion.php">Se déconnecter</a></li> </ul> </li> </ul> </nav> <header> <img src="./images/titre.png" alt="La gazette de L-INFO" width="780" height="83"> <h1>Le site de désinformation n°1 des étudiants en Licence Info</h1> </header> <main> <section class="centre"> <h2>&Agrave; la Une</h2> <a href="./php/article.php?id=XXX"> <img src="images/hacker.jpg" alt="Un mouchard dans un corrigé de Langages du Web"><br> Un mouchard dans un corrigé de Langages du Web </a> <a href="./html/article.html"> <img src="images/hymne.jpg" alt="Votez pour l'hymne de la Licence"><br> Votez pour l'hymne de la Licence </a> <a href="./php/article.php?id=XXX"> <img src="images/melenchon.jpg" alt="L'amphi Sciences Naturelles bientôt renommé amphi Mélenchon"><br> L'amphi Sciences Naturelles bientôt renommé amphi Mélenchon </a> </section> <section class="centre"> <h2>L'info brûlante</h2> <a href="./php/article.php?id=XXX"> <img src="images/walkingdead.jpg" alt="Il avait annoncé 'Je vais vous défoncer' l'enseignant relaxé"><br> Il leur avait annoncé "Je vais vous défoncer" l'enseignant relaxé </a> <a href="./php/article.php?id=XXX"> <img src="images/pingouins.jpg" alt="Des pinguoins dans l'amphi B"><br> Toute une famille de pingouins découverte dans l'amphi B </a> <a href="./php/article.php?id=XXX"> <img src="images/macron.jpg" alt="Emmanuel Macron obtient sa Licence d'Info en EAD"><br> Emmanuel Macron obtient sa Licence Info en EAD </a> </section> <section class="centre"> <h2>Les incontournables</h2> <a href="./php/article.php?id=XXX"> <img src="images/arnaque.jpg" alt="Arnaque au devoir corrigé de TLSP"><br> Une arnarque au corrigé de TL mise à jour </a> <a href="./php/article.php?id=XXX"> <img src="images/calendrier.jpg" alt="Le calendier des Dieux de la Licence bientôt disponible"><br> Le calendier des Dieux de la Licence bientôt disponible </a> <a href="./php/article.php?id=XXX"> <img src="images/sondage.jpg" alt="Allez-vous réussir votre année ?"><br> Résultat de notre sondage : allez-vous réussir votre année ? </a> </section> <section> <h2>Horoscope de la semaine</h2> <p>Vous l'attendiez tous, voici l'horoscope du semestre pair de l'année 2019-2020. Sans surprise, il n'est pas terrible...</p> <table id="horoscope"> <tr> <td>Signe</td> <td>Date</td> <td>Votre horoscope</td> </tr> <tr> <td>&#9800; Bélier</td> <td>du 21 mars<br>au 19 avril</td> <td rowspan="4"> <p>Après des vacances bien méritées, l'année reprend sur les chapeaux de roues. Tous les signes sont concernés. </p> <p>Jupiter s'aligne avec Saturne, péremptoirement à Venus, et nous promet un semestre qui ne sera pas de tout repos. Février sera le mois le plus tranquille puisqu'il ne comporte que 29 jours.</p> <p>Les fins de mois seront douloureuses pour les natifs du 2e décan au moment où tomberont les tant-attendus résultats du module d'<em>Algorithmique et Structures de Données</em> du semestre 3.</p> </td> </tr> <tr> <td>&#9801; Taureau</td> <td>du 20 avril<br>au 20 mai</td> </tr> <tr> <td>...</td> <td>...</td> </tr> <tr> <td>&#9811; Poisson</td> <td>du 20 février<br>au 20 mars</td> </tr> </table> <p>Malgré cela, notre équipe d'astrologues de choc vous souhaite à tous un bon semestre, et bon courage pour le module de <em>Système et Programmation Système</em>.</p> </section> </main> <footer>&copy; Licence Informatique - Janvier 2020 - Tous droits réservés</footer> </body> </html> 

вывод html:

<!doctype html><html lang="fr"><head><meta charset="UTF-8"><title>La gazette de L-INFO</title><link rel="stylesheet" type="text/css" href="./styles/gazette.css"></head><body><nav><ul> <li><a href="#">Accueil</a></li> <li><a href="./html/actus.html">Toute l'actu</a></li> <li><a href="./php/recherche.php">Recherche</a></li> <li><a href="./html/redaction.html">La rédac'</a></li> <li><a href="#">jbigoude</a> <ul> <li><a href="./php/compte.php">Mon profil</a></li> <li><a href="./php/nouveau.php">Nouvel article</a></li> <li><a href="./php/deconnexion.php">Se déconnecter</a></li></ul> </li> </ul></nav><header> <img src="./images/titre.png" alt="La gazette de L-INFO" width="780" height="83"><h1>Le site de désinformation n°1 des étudiants en Licence Info</h1></header><main><section class="centre"><h2>&Agrave; la Une</h2> <a href="./php/article.php?id=XXX"> <img src="images/hacker.jpg" alt="Un mouchard dans un corrigé de Langages du Web"><br> Un mouchard dans un corrigé de Langages du Web </a> <a href="./html/article.html"> <img src="images/hymne.jpg" alt="Votez pour l'hymne de la Licence"><br> Votez pour l'hymne de la Licence </a> <a href="./php/article.php?id=XXX"> <img src="images/melenchon.jpg" alt="L'amphi Sciences Naturelles bientôt renommé amphi Mélenchon"><br> L'amphi Sciences Naturelles bientôt renommé amphi Mélenchon </a></section> <section class="centre"> <h2>L'info brûlante</h2> <a href="./php/article.php?id=XXX"> <img src="images/walkingdead.jpg" alt="Il avait annoncé 'Je vais vous défoncer' l'enseignant relaxé"><br> Il leur avait annoncé "Je vais vous défoncer" l'enseignant relaxé </a> <a href="./php/article.php?id=XXX"> <img src="images/pingouins.jpg" alt="Des pinguoins dans l'amphi B"><br> Toute une famille de pingouins découverte dans l'amphi B </a> <a href="./php/article.php?id=XXX"> <img src="images/macron.jpg" alt="Emmanuel Macron obtient sa Licence d'Info en EAD"><br> Emmanuel Macron obtient sa Licence Info en EAD </a> </section> <section class="centre"> <h2>Les incontournables</h2> <a href="./php/article.php?id=XXX"> <img src="images/arnaque.jpg" alt="Arnaque au devoir corrigé de TLSP"><br> Une arnarque au corrigé de TL mise à jour </a> <a href="./php/article.php?id=XXX"> <img src="images/calendrier.jpg" alt="Le calendier des Dieux de la Licence bientôt disponible"><br> Le calendier des Dieux de la Licence bientôt disponible </a> <a href="./php/article.php?id=XXX"> <img src="images/sondage.jpg" alt="Allez-vous réussir votre année ?"><br> Résultat de notre sondage : allez-vous réussir votre année ? </a> </section> <section> <h2>Horoscope de la semaine</h2><p>Vous l'attendiez tous, voici l'horoscope du semestre pair de l'année 2019-2020. Sans surprise, il n'est pas terrible...</p> <table id="horoscope"> <tr> <td>Signe</td> <td>Date</td> <td>Votre horoscope</td> </tr> <tr> <td>&#9800; Bélier</td> <td>du 21 mars<br>au 19 avril</td> <td rowspan="4"> <p>Après des vacances bien méritées, l'année reprend sur les chapeaux de roues. Tous les signes sont concernés. </p> <p>Jupiter s'aligne avec Saturne, péremptoirement à Venus, et nous promet un semestre qui ne sera pas de tout repos. Février sera le mois le plus tranquille puisqu'il ne comporte que 29 jours.</p> <p>Les fins de mois seront douloureuses pour les natifs du 2e décan au moment où tomberont les tant-attendus résultats du module d'<em>Algorithmique et Structures de Données</em> du semestre 3.</p> </td> </tr> <tr> <td>&#9801; Taureau</td> <td>du 20 avril<br>au 20 mai</td> </tr> <tr> <td>...</td> <td>...</td> </tr> <tr> <td>&#9811; Poisson</td> <td>du 20 février<br>au 20 mars</td> </tr> </table> <p>Malgré cela, notre équipe d'astrologues de choc vous souhaite à tous un bon semestre, et bon courage pour le module de <em>Système et Programmation Système</em>.</p> </section></main><footer>&copy; Licence Informatique - Janvier 2020 - Tous droits réservés</footer></body></html>

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

После некоторого общения с OP, я надеюсь, что я правильно понял проблему.

HTML теги хранятся в отдельном файле по одному на строку (tag_file.txt), в отдельном файле у нас есть HTML веб-страница код (файл. html).

Код должен разделять пробелы в HTML коде веб-страницы (файл. html) вокруг тегов [открытия, закрытия], указанных в файле тегов (tag_file.txt).

ПРИМЕЧАНИЕ: обработка выполнена сценарием perl без помощи оболочки (сокращает время обработки)

use strict;
use warnings;
use feature 'say';

my $tag_file    = 'tag_file.txt';
my $html_file   = 'file.html';

open my $fh_tag, '<', $tag_file         # open tag file
    or die "Couldn't open $tag_file: $!";

my @tags = <$fh_tag>;                   # read tags into array
chomp @tags;                            # remove eol from tag lines

close $fh_tag;                          # close tag file

open my $fh_html, '<', $html_file       # open html file
    or die "Couldn't open $html_file: $!";

my $html = do { local $/; <$fh_html> }; # read whole file into variable

close $fh_html;                         # close html file

# now make substitution for each read tag
for my $tag (@tags) { $html =~ s!\s*(</?$tag\s*.*?>)\s*!$1!g; }

say $html;

Содержимое tag_file.txt

html
head
body
section
0 голосов
/ 04 марта 2020

Основная проблема с вашей строкой perl - это ваше цитирование; Вы использовали одинарные кавычки, что означает, что вам не нужно экранировать переменные Perl, но это также означает, что переменная оболочки ${tag} будет интерпретироваться как Perl (там, где она пуста), а не оболочкой. Вы можете легко получить доступ к переменным оболочки из Perl, передав их в качестве аргументов или переменных среды. Вы также не использовали переключатель -i для редактирования на месте, поэтому вы просто распечатали изменения в STDOUT.

С установленным ojo вы можете сделать это с правильным HTML синтаксический анализатор и, следовательно, не восприимчивый к крайним случаям:

env tag=$tag perl -0777 -pi -CS -Mojo -e '$_ = x($_);
  $_->find($ENV{tag})->each(sub {
    $_->content($_->content =~ s/\A *//r =~ s/ *\z//r);
    my ($p, $n) = ($_->previous_node, $_->next_node);
    $p->content($p->content =~ s/ *\z//r) if defined $p and ($p->type eq "text" or $p->type eq "raw");
    $n->content($n->content =~ s/\A *//r) if defined $n and ($n->type eq "text" or $n->type eq "raw");
  })' tmp_html

Переключатель -0777 гарантирует, что файл будет работать за один шаг, а не по строке, -pi переносит код в все oop, который назначит вход для $_, а затем обновит этот файл на месте с результирующим значением $_, а -CS гарантирует, что он будет декодирован из UTF-8 для анализа и закодирован обратно после.

Функция x из ojo создает объект Mojo :: DOM , который затем может найти каждый экземпляр запрошенного тега и работать с ним (включая его содержимое и закрывающий тег).

Операции подстановки: s/\A *//r и s/ *\z//r удаляют все пробелы в начале или конце строки соответственно и возвращают измененную строку (/r не позволяет работать на месте, поэтому вы можете использовать это с помощью метода содержимого Mojo :: DOM). Вместо этого удалите все пробельные символы (включая символы новой строки), используйте s/\A\s*//r и s/\s*\z//r.

...