Как подкачать все блоки HTML в нескольких файлах с sed

Если Ваша версия rsync не поддерживает --no-motd опция, помещая LogLevel quiet в ~/.ssh/config добьется цели.

3
17.01.2015, 16:42
4 ответа

Пашины HTML с регулярным воздействием явно обескуражены.

Вместо этого вы можете использовать XMLSTARlet & Если ваши исходные файлы являются действительными XHTML:

xmlstarlet edit -L -u "//div[@class='a']" -v 'some inner HTML' file.xhtml

, если это недействительно, XHTML, попробуйте адаптировать следующий код Perl:

use strict;
use warnings;
use 5.008;

use File::Slurp 'read_file';
use HTML::TreeBuilder;

sub replace_keyword
{
  my $elt = shift;

  return if $elt->is_empty;

  $elt->normalize_content;      # Make sure text is contiguous

  my $content = $elt->content_array_ref;

  for (my $i = 0; $i < @$content; ++$i) {
    if (ref $content->[$i]) {
      # It's a child element, process it recursively:
      replace_keyword($content->[$i])
          unless $content->[$i]->tag eq 'a'; # Don't descend into <a>
    } else {
      # It's text:
      if ($content->[$i] =~ /here/) { # your keyword or regexp here
        $elt->splice_content(
          $i, 1, # Replace this text element with...
          substr($content->[$i], 0, $-[0]), # the pre-match text
          # A hyperlink with the keyword itself:
          [ a => { href => 'http://example.com' },
            substr($content->[$i], $-[0], $+[0] - $-[0]) ],
          substr($content->[$i], $+[0])   # the post-match text
        );
      } # end if text contains keyword
    } # end else text
  } # end for $i in content index
} # end replace_keyword


my $content = read_file('foo.shtml');

# Wrap the SHTML fragment so the comments don't move:
my $html = HTML::TreeBuilder->new;
$html->store_comments(1);
$html->parse("<html><body>$content</body></html>");

my $body = $html->look_down(qw(_tag body));
replace_keyword($body);

# Now strip the wrapper to get the SHTML fragment back:
$content = $body->as_HTML;
$content =~ s!^<body>\n?!!;
$content =~ s!</body>\s*\z!!;

Заимствованы из https://stackoverflow.com/questions/3900870/how-can-i-modify-html-files-in-perl

0
27.01.2020, 21:23

Если вы хотите поставить раздел из ранее BBB сразу после него:

sed -i '/<div class="aaa">/{
        :1
        /<\/div> <\!-- end aaa -->/!{N;b 1}
        /<\/div> <\!-- end aaa -->/{N;h}
        d}
        /<\/div><\!-- end bbb -->/{n;G}' *html
1
27.01.2020, 21:23

Это не работает для SED , если вы не глютрон для наказания. По крайней мере, в более общей корпусе, где начало блока более, чем одна строка (или о том, что теги разделены на несколько строк, что вполне возможно в XML / HTML).

Если вы действительно должны сделать это с чем-либо еще, чем анализатор XML (да, либо закрепление ввода или вырезания сломанных деталей, как правило, является лучшей идеей), используйте что-то вроде AWK , по крайней мере, Это гораздо больше подходит для этой задачи *) . Общая идея состоит в том, чтобы:

  1. печать входных строк до начала первого блока;
  2. накапливают линии первого блока для обмена;
  3. накапливают линии между блоками;
  4. линии печати второго блока;
  5. Линии печати части между блоками, накопленными на шаге 3;
  6. Линии печати первого блока, накопленного на этапе 2;
  7. Распечатать остальные.

Также не забывайте проверить Canonical Canonical SO Q & A .

* Почему я утверждаю, что: SED ориентирован на линейные и предназначенные для простых ( Ваш пробег может варьироваться ) текстовые преобразования. Хотя это верно для AWK (и в некоторой степени для Perl), а также написание более сложных сценариев проще в последнем (легче доступ к нескольким переменным, автоматическим расщеплением на полях и т. Д.). Таким образом, если вам не нужно только поменять две чрезвычайно хорошо разграниченные блоки и никогда не понадобится расширить сценарий для обработки по-разному отформатированным входом, более сложный язык, скорее всего, будет лучшим инструментом. Тем не менее, Perl имеет анализатор XML, легко доступный в качестве модуля.

1
27.01.2020, 21:23

Используемый контейнер докера не является утилитой для дегтя. Я проверил это, используя следующее;

sudo docker run -i -t rhel6 /bin/bash

Это создало интерактивную оболочку для меня в Docker с помощью образа rhel6, оттуда я могу проверить интерактивным способом ошибку, которую вы видите;

bash-4.1# find / -name tar
bash-4.1# yum list | grep -i tar
upstart.x86_64               0.6.5-13.el6_5.3               @koji-override-0/6.5

Обе эти команды показывают, что деготь не установлен и не доступен.

Я не уверен в ваших рассуждениях о том, как использовать rhel, или как rhel работает с лицензией в контейнерах Docker, но можно ли использовать CentOS, которая предоставляет смолу в качестве стандарта;

sudo docker run -i -t centos /bin/bash
bash-4.1# yum list | grep -i tar
---snip---
tar.x86_64                               2:1.26-29.el7                   base   
---snip---
-121--217543-

У меня аналогичный случай. Мой ящик имеет 12GB ОЗУ и в течение ночи все настольные приложения были заменены на кэш и так далее. Основная причина, я думаю, что кэш (грязные страницы) может занять до 60% оперативной памяти по умолчанию, и когда этот предел достигнут, ядро вдруг хочет флэш 6GB грязные страницы на диск, что эффективно убивает производительность.

Я исправил следующие параметры в/etc/sysctl.conf

# use only 10% of RAM for the cache (dirty pages).
vm.dirty_ratio=10 
# start flashing with 1% dirty pages
vm.dirty_background_ratio=1
-121--63212-

Вот еще один sed :

sed '/.*<div class="...">.*/{ h;s///;x;:n
     /<.div>/!N;/<!-- end/x;/<.div>/x;//!bn
    s/\(.*\).\(<div class=.*>\).*/\2\1/;x
     /<.div>[^>]*$/s/.//;H;x
}'

Начиная с class =.???. и проходя через, как бы много блоков у вас ни было, для каждой пары это меняет позиции. Итак, вот несколько примеров:

Если sed встречается со строкой, которая соответствует:

<div class=".\{3\}">

... при чтении ее в файле это обеспечит H старое пространство полностью ясно, а затем начать тянуть в каждой строке, пока она не встретит либо строку, которая соответствует:

<.div>

... и ...

<!-- end

... или только первое. Если они совпадают, то sed сохраняет блок в альтернативном буфере и извлекает второй блок перед заменой их позиций на выходе.

Если только первый не влияет на положение блоков. Таким образом, несовпадающие пары остаются в одиночестве.

В качестве входных данных...

<div class="wrapper">
<div class="aaa"> first </div> <!-- end aaa -->
between
<div class="bbb"> swap two </div> <!-- end bbb -->
blocks
<div class="ccc"> mismatched </div> <!-- end ccc --> 
the end         
</div>

Он печатает...

<div class="wrapper">
<div class="bbb"> swap two </div> <!-- end bbb -->
between
<div class="aaa"> first </div> <!-- end aaa -->
blocks
<div class="ccc"> mismatched </div> <!-- end ccc -->
the end
</div>

... если дано:

<div class="wrapper">
<div class="aaa"> first </div> <!-- end aaa -->
between
<div class="bbb"> swap two </div> <!-- end bbb -->
blocks
<div class="ccc"> matched </div> <!-- end ccc --> 
the end
<div class="ddd"> now matched </div> <!-- end ddd -->
</div>

Он печатает...

<div class="wrapper">
<div class="bbb"> swap two </div> <!-- end bbb -->
between
<div class="aaa"> first </div> <!-- end aaa -->
blocks
<div class="ddd"> now matched </div> <!-- end ddd -->
the end
<div class="ccc"> matched </div> <!-- end ccc -->
</div>

И, несмотря на то, что все примеры разбиты так, что ради космоса, он не имеет реальной заботы о том, начинается ли < div class = и < .div > секции попадают на одну и ту же строку или нет:

<div class="wrapper">
<div class="aaa">

the first
block is here

</div> <!-- end aaa -->

these lines were
between aaa and bbb

<div class="bbb">

this is the second block
it should be swapped with the first

</div> <!-- end bbb -->

more
blocks
follow

<div class="ccc"> this is matched </div> <!-- end ccc -->
not the end
<div class="ddd">

this last block
is matched with the ccc line
</div> <!-- end ddd -->

this is the end
</div>

Получает...

<div class="wrapper">
<div class="bbb"> 

this is the second block
it should be swapped with the first

</div> <!-- end bbb -->

these lines were
between aaa and bbb

<div class="aaa"> 

the first
block is here

</div> <!-- end aaa -->

more
blocks
follow

<div class="ddd"> 

this last block
is matched with the ccc line
</div> <!-- end ddd -->
not the end
<div class="ccc"> this is matched </div> <!-- end ccc -->

this is the end
</div>
1
27.01.2020, 21:23

Теги

Похожие вопросы