Как я могу использовать awk или Perl для постепенного увеличения числа в большом XML-файле?

Поместите их в одну сеть и используйте имена контейнеров в качестве имен хостов:

docker network create foo
docker run --network=foo --name mysqlcontainer -d mysql-img
docker run --network=foo --name javacontainer -d java-img

Не открывать порты - они автоматически отображаются между контейнерами внутри сети.

Для подключения внутри используйте mysqlcontainer:3306 и javacontainer:9090.

Для подключения с хоста вам понадобится выставить порт.

5
задан brian d foy 27 January 2010 в 07:57
поделиться

5 ответов

Если бы Вы находитесь на поле с командой xsltproc на месте, я предложил бы, чтобы Вы использовали XSLT для этого.

Для решения для Perl я пошел бы для использования DOM. Проверьте этот DOM, Обрабатывающий со статьей Perl.

Это сказало. Если Ваш XML-файл производится предсказуемым способом, что-то наивное как следующее могло бы работать:

perl -pe 's#(<VALUE DECIMAL_VALUE=")([0-9.]+)(" UNIT_TYPE="percent"/>)#"$1" . ($2 + 0.4) . "$3"#e;'
4
ответ дан 14 December 2019 в 01:19
поделиться

Это берет вход на stdin, выводах к stdout:

while(<>){
 if( $_ =~ /^(.*DECIMAL_VALUE=\")(.*)(\".*)$/ ){
  $newVal = $2 + 0.04;
  print "$1$newVal$3\n";
 }else{
  print $_;
 }
}
2
ответ дан 14 December 2019 в 01:19
поделиться

Если Вы абсолютно уверены, что формат Вашего XML никогда не будет изменяться, что порядок атрибутов фиксируется, который можно действительно получить, regexp для права числа... затем идут для основанного на несинтаксическом анализаторе решения.

Лично я использовал бы XML:: Ветка (возможно, потому что я записал это;-). Это обработает XML как XML, все еще уважение исходного формата файла, и не загрузит все это в памяти прежде, чем начать работать.

Непротестированный код ниже:

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

use XML::Twig;

XML::Twig->new( # call the sub for each VALUE element with a DECIMAL_VALUE attribute
                twig_roots => { 'VALUE[@DECIMAL_VALUE]' => \&upd_decimal },
                # print anything else as is
                twig_print_outside_roots => 1,
              )
         ->parsefile_inplace( 'foo.xml');

sub upd_decimal
  { my( $twig, $value)= @_; # twig is the XML::Twig object, $value the element
    my $decimal_value= $value->att( 'DECIMAL_VALUE');
    $decimal_value += 0.4;
    $value->set_att( DECIMAL_VALUE => $decimal_value);
    $value->print;
  }
3
ответ дан 14 December 2019 в 01:19
поделиться

Что-то сродни следующему будет работать. Этому, возможно, понадобится тонкая настройка, если существует дополнительный интервал, но это оставляют как осуществление для читателя.

function update_after(in_string, locate_string, delta) {
    local_pos = index(in_string,locate_string);
    leadin    = substr(in_string,0,local_pos-1);
    leadout   = substr(in_string,local_pos+length(locate_string));
    new_value = leadout+delta;
    quote_pos = index(leadout,"\"");
    leadout   = substr(leadout, quote_pos + 1);
    return leadin locate_string new_value"\"" leadout;
}

/^ *\<VALUE/{
    print  update_after($0, "DECIMAL_VALUE=\"",0.4);
}
0
ответ дан 14 December 2019 в 01:19
поделиться

вот gawk

awk '/DECIMAL_VALUE/{
 for(i=1;i<=NF;i++){
    if( $i~/DECIMAL_VALUE/){
        gsub(/DECIMAL_VALUE=|\042/,"",$i)
        $i="DECIMAL_VALUE=\042"$i+0.4"\042"
    }
 }
}1' file
0
ответ дан 14 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

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