Sed / awk Regex: XML-канал

Вот что я сделал, чтобы "решить" это:

  1. Set MaxClients 7 (на основе (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7. 5747747747747747747747747747748)

Therefore:


StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000

  1. Отключите все модули Apache, кроме authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module, php5_module

  2. Удалите пакет mod_ssl, поскольку клиент не использует https: //что именно.

Я отчитаюсь, когда эта новая конфигурация будет работать некоторое время, чтобы посмотреть, решит ли это проблему.

Некоторое вдохновение здесь было позаимствовано из: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ и http://www.activoinc.com/downloads/httpd.conf-magento

0
09.04.2018, 16:39
3 ответа
sed -E '/^[[:blank:]]*<description><!\[CDATA\[/s/([!?.])[^!?.<]*<a/\1 <a/' file

Это будет искать все строки, начинающиеся с точной строки <description><![CDATA[(, возможно, перед которой стоят пробелы или табуляция ). В этих строках будет произведена замена.

Замена соответствует ограничителю предложения ([!?.]), за которым следует любое количество символов, которые не являются не ограничителями предложения или <, и строкой <a. Это будет заменено первым разделителем предложения, пробелом и строкой <a.

0
28.01.2020, 04:26

Я протестировал приведенную ниже команду sed, и у меня все сработало

 sed "s/particulier\..*<a/particulier.<a/g" file

выход

...Something before
<description><![CDATA[Des  chercheurs de l&#x27;université de Columbia à New York ont mis au point un nouveau moyen de cacher un message dans un texte sans en altérer le sens et sans dépendre d&#x27;un format de fichier particulier.<a href="https://korben.info/cacher-des-informations-dans-un-texte-grace-a-des-modifications-sur-les-caracteres.html">Passage a la news suivante</a>]]></description>
... Other news
0
28.01.2020, 04:26

Хотя XML — это только текстовый -формат, пытаться манипулировать им с помощью sed и/или awk — ужасная идея, потому что формат имеет так много краеугольных случаев и исключений в способах его использования, что вам действительно стоит задуматься. его как двоичный формат, который просто читается невооруженным глазом, а не как текстовый формат. Это кажется легким, пока вы на самом деле не попробуете. Короткий ответ: просто не надо.

Вместо этого я бы предложил использовать язык сценариев с библиотекой для обработки XML. Таких библиотек много. В Perl вы могли бы сделать что-то в этом роде:

#!/usr/bin/perl -wCSDA
use strict;
use warnings;

package MyFilter;
use base qw(XML::SAX::Base);

sub new {
    my $class = shift;
    my @args = @_;
    my $self = $class->SUPER::new(@args);

    $self->{indesc} = 0;
    return $self;
}

sub start_element {
    my $self = shift;
    my $data = shift;
    if ($data->{LocalName} eq "description") {
        $self->{indesc} = 1;
    }
    return $self->SUPER::start_element($data);
}

sub end_element {
    my $self = shift;
    my $data = shift;
    if ($data->{LocalName} eq "description") {
        $self->{indesc} = 1;
    }
    return $self->SUPER::end_element($data);
}

sub characters {
    my $self = shift;
    my $data = shift;
    if(($self->{indesc}) == 1) {
        $data->{Data} =~ s/\.[^\.]*<a href/.<a href/;
    }
    return $self->SUPER::characters($data);
}

package main;

use XML::SAX::ParserFactory;
use XML::SAX::Writer;

my $writer = XML::SAX::Writer->new();

my $filter = MyFilter->new(Handler => $writer);

my $input = XML::SAX::ParserFactory->parser(Handler => $filter);

$input->parse_uri("input.xml");

Это работает следующим образом:

  • Строка package MyFilter;сигнализирует о классе, который реализует фильтр XML ::SAX :
    • sub new— это конструктор, который на самом деле создает только флаг $self->{indesc}.
    • sub start_elementвызывается каждый раз при открытии элемента XML. Мы проверяем, является ли рассматриваемый элемент элементом <description>; если да, то устанавливаем флаг (и передаем дальнейшую обработку суперклассу ).
    • sub end_elementвызывается каждый раз при закрытии XML-элемента. Мы проверяем, является ли рассматриваемый элемент элементом <description>; если да, то сбрасываем флаг (и передаем дальнейшую обработку суперклассу ).
    • sub charactersвызывается каждый раз, когда обрабатывается текст или элемент CDATA. В этом подразделе мы проверяем, установлен ли флаг; если это так, мы применяем регулярное выражение к передаваемым данным, чтобы любое неполное предложение отбрасывалось (, только считая с точки; улучшение этого регулярного выражения оставлено читателю в качестве упражнения; -П)
  • Пакет mainсодержит начальную точку скрипта :
    • Он устанавливает XML::SAX::Writer(, который просто выводит проанализированные XML-данные, которые снова передаются в формате XML, на стандартный вывод по умолчанию ), подключает их к нашему фильтру (, поэтому XML-данные передаются в модуль записи содержит данные XML, полученные фильтром с удаленными неполными предложениями ), и подключает фильтр к синтаксическому анализатору XML, созданному с помощью XML::SAX::ParserFactory.
    • Затем вся цепочка передается на вход (, предполагается, что ее можно найти в файле с именемinput.xml).

Если это кажется сложным, то это потому, что так оно и есть. Если у вас есть выбор, просто откажитесь от XML и используйте вместо этого что-то более простое, например JSON или YAML;-)

0
28.01.2020, 04:26

Теги

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