Не используйте регулярные выражения для синтаксического анализа XML. Он грязный - склонен к взлому и создает хрупкий код. Есть множество вещей, которые могут тривиально вас сбить с толку, например, количество строк - в XML вполне допустимо форматировать элемент:
<calculation name="AB" field="SEC_YLD_1" />
Или:
<calculation
field="SEC_YLD_1"
name="AB"
/>
И множество других вариантов - все они семантически идентичны, но ... не будет соответствовать одному и тому же регулярному выражению.
Для вашего примера это поразительно просто, если вы используете синтаксический анализатор. perl
имеет XML :: Twig
, который может сделать это легко:
Удалить:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> parsefile ( 'your_file.xml' );
$_ -> delete for $twig -> get_xpath('//ric[@id="AUG03250639E=YBAU"]');
$twig -> set_pretty_print('indented');
$twig -> print;
Примечание - удаляет дубликаты, если они существуют.
Теперь создаем новый - похоже, вы пытаетесь скопировать и изменить - так что:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> parsefile ( 'your_file.xml' );
#find one to copy - this will just get the first 'ric' element.
my $ric_to_copy = $twig -> get_xpath('//ric',0);
#copy it
my $new_ric = $ric_to_copy -> copy;
#alter the new one
$new_ric -> set_att('id', 'BBBBB=YBAU' );
#paste it
$new_ric -> paste ( 'last_child', $ric_to_copy->parent);
$twig -> set_pretty_print('indented');
$twig -> print;
Теперь это читается и печатается в STDOUT - вы можете печатать в конкретный файл:
my ( $output, '>', 'new.xml') or die $!;
print {$output} $twig -> sprint;
close ( $output );
Перенаправление стандартного ввода делает свое дело.
Используйте команду типа:ffmpeg... > output.log 2>&1 < /dev/null &
.
> output.log
Перенаправить стандартный вывод в output.log. 2>&1
Перенаправить stderr в stdout (, чтобы он оказался в файле журнала, а не в терминале ). < /dev/null
Перенаправить stdin (, который, по мнению ffmpeg, ему нужен )на /dev/null
(, что дает пустой поток ). &
процесс выполняется в фоновом режиме.