Входной файл "input.xml":
<integer name="leftValue">30</integer>
<integer name="rightValue">580</integer>
<integer name="rightValueDefault">495</integer>
Я хочу, чтобы каждое числовое значение умножалось на 2:
<integer name="leftValue">60</integer>
<integer name="rightValue">1160</integer>
<integer name="rightValueDefault">990</integer>
Как это сделать?
В целом Вы не должны анализировать HTML / XML, использующий регулярные выражения.
Однако, если Ваш входной файл действительно похож на один показанный в примере (единственный открывающий и закрывающий тэг на каждой строке и нет >
символ до конца открывающего тэга), с помощью Perl:
perl -pe 's/>([0-9]+)/">".$1*2/e' in
s
: утверждает для выполнения замены/
: запускает шаблон>
: соответствия a >
символ([0-9]+)
: соответствия и группы одна или несколько цифр/
: останавливается шаблон / запускает замещающую строку">".$1*2
: выражение; конкатенация двух строк, a >
символ и первая полученная группа, умноженная на 2
/
: останавливается замещающая строка / запускает флаги шаблонаe
: утверждает для оценки замещающей строки% cat in
<integer name="leftValue">30</integer>
<integer name="rightValue">580</integer>
<integer name="rightValueDefault">495</integer>
% perl -pe 's/>([0-9]+)/">".$1*2/e' in
<integer name="leftValue">60</integer>
<integer name="rightValue">1160</integer>
<integer name="rightValueDefault">990</integer>
Используйте надлежащий анализатор XML. Например, в xsh, Вы можете просто написать
open input.xml ;
for //text if (. > 0) set . (2 * .) ;
save :b ;
$@
лучше, чем $*
, начиная с него doesn' t изменяют вещи, если IFS
изменяется: ' таким образом, " $ *" эквивалентно " c$1$ 2 c†¦ " где c является первым символом значения переменной ' IFS; . С другой стороны, ' " $ " эквивалентно " 1$ " " 2$ " †¦ ' .
– Chai T. Rex
5 January 2017 в 07:35