Хотя 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;-)
Столкнувшись с похожей проблемой,
sudo route add default ppp0
сработало для меня.
Если вам нужна автоматизация процесса, вы можете создать скрипт в /etc/ppp/ip -up.d, он будет выполняться при установке соединения.