Linux ppp0 и маршрут по умолчанию и как подключиться к общедоступному интернету

Хотя 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
12.02.2020, 01:50
1 ответ

Столкнувшись с похожей проблемой,

sudo route add default ppp0

сработало для меня.

Если вам нужна автоматизация процесса, вы можете создать скрипт в /etc/ppp/ip -up.d, он будет выполняться при установке соединения.

2
28.04.2021, 23:23

Теги

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