Команда работает в командной строке, но не работает в сценарии оболочки [дубликат]

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

Больше примеров см: https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags

ПОЖАЛУЙСТА, используйте парсер. Они существуют во многих языках - лично мне нравится perl, и ваша задача выглядит примерно так:

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

#parser library
use XML::Twig; 

#ingest data 
my $twig = XML::Twig -> parse (\*DATA); 

#iterate all tags 
foreach my $group  ( $twig -> get_xpath('//ThreadGroup') ) {
   #check testname regex match
   if ( $group -> att('testname') =~ /AA/ ) { 
       #set enabled
       $group -> set_att('enabled', 'true');
   }
   else {
      #set disabled
      $group -> set_att('enabled', 'false'); 
   }
}

#pretty print options vary, see man page. 
$twig -> set_pretty_print('indented_a');
$twig -> print;

__DATA__




И да - необходимо использовать парсер XML, потому что регулярные выражения не могут сделать это безопасно. В XML есть куча вещей, которые семантически идентичны, например, упорядочивание атрибутов, перевод строки, унарные теги и т.д., которые не поддаются одному и тому же regex. Но синтаксический анализатор не будет пойман этим.

Вышеизложенное можно сократить до одной фразы, если хотите:

perl -MXML::Twig -e 'XML::Twig -> new ( twig_handlers => { ThreadGroup => sub { $_ -> set_att("enabled", $_ -> att("testname") =~ /AA/ ? "true" : "false" ) } } ) -> parsefile_inplace("yourfile")'

Ваша команда системных администраторов должна поблагодарить вас за это (это не значит, что они это сделают), потому что любое решение, основанное на регулярных выражениях, может однажды сломаться без видимых причин.

Самый банальный пример - ваш XML семантически идентичен:


  
  

Или:


  
  

Или:


Или:


И это еще до того, как мы узнаем об упорядочивании атрибутов, возможном вложении тегов или других подстроках, которые "совпадают" там, где вы не ожидаете.

3
28.07.2016, 17:21
0 ответов

Теги

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