1 (08.03.2013 05:19:16 отредактировано semiono)

      <item>
         <string name="Group" value="TransportWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
               <int name="H" value="321"/>
               <int name="V" value="690"/>
            </obj>
         </member>
      </item>

Нужно изменить значения "H" и "V" из коммандной строки. Нашёл какие-то похожие действия с awk, но там лес кода сам не разберусь)
Хотя ещё узнать бы разрешение экрана, чтобы подставить в эти значения, но это уже второй вопрос.
И если возможно попроще, я снова спрашиваю под GnuWin32 awk, grep, sed...

То-есть имеется файл defaults.xml в котором множество блоков и надо найти именно нужный.

sudo включить компьютер

2

semiono⇓ пишет:

Нужно изменить значения "H" и "V" из коммандной строки.

Если совсем «в лоб», то можно и так:

sed -i'.bak' -e 's/value=\"321/value=\"123/g' -e 's/value=\"690/value=\"096/g' defaults.xml

Но это именно «в лоб»! И заметьте, файл перезаписывается, если сохранённая копия не нужна, уберите '.bak'.

semiono⇓ пишет:

Нашёл какие-то похожие действия с awk, но там лес кода сам не разберусь)

Покажите.

semiono⇓ пишет:

Хотя ещё узнать бы разрешение экрана, чтобы подставить в эти значения, но это уже второй вопрос.

Конечная цель задачи какая? Возможно, есть уже и готовые решения.

Был, был и весь вышел...

3 (08.03.2013 15:33:28 отредактировано xxblx)

semiono пишет:

И если возможно попроще, я снова спрашиваю под GnuWin32 awk, grep, sed...

Это, конечно, не grep, awk, sed, но вдруг пригодится.

Python 2

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import re

newh = input('Новое значение для h? ')
newv = input('Новое значение для v? ')
h = str(newh)
v = str(newv)

ourxml = open("defaults.xml")
data = ourxml.read()
ourxml.close()

varh = re.findall('<int name="H" value="(.+?)"/>', data, re.DOTALL) 
varv = re.findall('<int name="V" value="(.+?)"/>', data, re.DOTALL) 

data = data.replace(varh[0], h)
data = data.replace(varv[0], v)

ourxmlfix = open('defaults.xml', 'w')
for line in data:
    ourxmlfix.write(line)
ourxmlfix.close()
Fedora GNOME3

4

semiono, на сколько строгое должно быть решение?
абсолютно строго средствами что sed'а, что awk'а это очень геморройно... для этих целей лучше подойдёт какой-нить язык с xml-парсером (python/perl). конечно не так тупо, как у xxblx, но на них...

на sed'е можно примерно с теме же регулярками, что у xxblx, только sed ленивые регулярки не умеет, поэтому изощряться придётся:
sed 's!\(<int name="H" value="\)[^"]*\("/>\)!\1100500\2!'
но это годное для половины случаев, но не надёжное решение...

95% процентов проблем находятся между клавиатурой и стулом.

5

Какие-то инструменты я нашёл: http://xmlstar.sourceforge.net/
Давно хотел найти иструменты командной строки для работы с XML, хотя для этого специально пришлось поиском занятся.

sudo включить компьютер

6

А ещё просьба, а есть калькулятор или чтонибудь для вывода значений формулы в файл..
корень из двух 12 степени в степени N умноженный на 440,0 где N это {1, 2 ,3... 12}
Чтоб получился file.txt
440.00
466.16
..
880.00

sudo включить компьютер

7

semiono⇓ пишет:

А ещё просьба, а есть калькулятор или чтонибудь для вывода значений формулы в файл..
корень из двух 12 степени в степени N умноженный на 440,0 где N это {1, 2 ,3... 12}

если традиционный unix-way, то bc.
или можно тем же питоном обойтись...

95% процентов проблем находятся между клавиатурой и стулом.

8

semiono⇓ пишет:

То-есть имеется файл defaults.xml в котором множество блоков и надо найти именно нужный.

По какому признаку находится нужный блок?

Да, у меня Ubuntu.
Нет, не глючит.

9 (08.03.2013 21:38:39 отредактировано semiono)

-=Serj=- пишет:
semiono⇓ пишет:

То-есть имеется файл defaults.xml в котором множество блоков и надо найти именно нужный.

По какому признаку находится нужный блок?

Еслиб я знал, пока гадаю, я с xml не знаком. Кстати, xmlstarlet-1.4.2-win32 юникс-вей, но мне от этого не легче)

Вот примерный документ

<Defaults>
   <list name="Entries" type="list">

<!-- Event Image -->
      <item>
         <string name="Group" value="Event Image"/>
         <member name="Values">
            <int name="Show Data" value="1"/>
            <int name="Show Names" value="0"/>
            <int name="Transparent" value="0"/>
         </member>
      </item>

<!-- PTrackEffectWindow -->
      <item>
         <string name="Group" value="PTrackEffectWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="183011808">
               <int name="H" value="1"/>
               <int name="V" value="1"/>
            </obj>
            <int name="State" value="1"/>
         </member>
      </item>

<!-- Enable Record on Select Track -->
      <item>
         <string name="Group" value="Record"/>
         <member name="Values">
            <int name="Enable Record on Select Track" value="1"/>
         </member>
      </item>

<!-- Registration -->
      <item>
         <string name="Group" value="Registration"/>
         <member name="Values">
            <int name="Registered 4.0" value="1"/>
         </member>
      </item>

<!-- TransportWindow -->
      <item>
         <string name="Group" value="TransportWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
               <int name="H" value="321"/>
               <int name="V" value="690"/>
            </obj>
         </member>
      </item>

            </list>
</Defaults>

Напрягают строки вида <int name="H" value="1"/> где <value и name> в одном тэгге записанны,
хотя xml.exe кое какие результаты показал, тепрь на моём файле бы их применить. Изучаю пока)

Коментарии я сам добавил, надеюсь правильно:
<!-- PTrackEffectWindow -->

sudo включить компьютер

10 (08.03.2013 23:26:30 отредактировано xxblx)

Fat-Zer пишет:

для этих целей лучше подойдёт какой-нить язык с xml-парсером (python/perl). конечно не так тупо, как у xxblx, но на них...

Под "тупо"  подразумевается - "слишком в лоб"?
Ну так и вариант этот не конкретно для xml, а по сути для любых текстовых файлов подойдет. Или есть более элегантный способ, работающий с любыми текстовыми файлами?

Fedora GNOME3

11

Пример: file.xml

<Defaults>
   <list name="Entries" type="list">

      <item>
         <string name="Group" value="zzzz"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
               <int name="H" value="321"/>
               <int name="V" value="690"/>
            </obj>
         </member>
      </item>

      <item>
         <string name="Group" value="TransportWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
               <int name="H" value="321"/>
               <int name="V" value="690"/>
            </obj>
         </member>
      </item>

            </list>
</Defaults>

# xml ed -u "/Defaults/list/item/string[@value=TransportWindow]/member/obj/int[@name=H]" -v 777 file.xml

что-то не хочет

sudo включить компьютер

12

xxblx⇓ пишет:

varh = re.findall('<int name="H" value="(.+?)"/>', data, re.DOTALL)

ИМХО, флаг DOTALL как и . в регулярке здесь неуместны.

xxblx⇓ пишет:

data = data.replace(varh[0], h)
data = data.replace(varv[0], v)

Таким макаром заменятся все числа в тексте, совпавшие с найденными.

Да, у меня Ubuntu.
Нет, не глючит.

13

semiono⇓ пишет:

Пример: file.xml

Не пойму, значения нужно во всех вхождениях менять или только внутри элемента, содержащего

<string name="Group" value="TransportWindow"/>

?

Да, у меня Ubuntu.
Нет, не глючит.

14 (09.03.2013 00:16:13 отредактировано -=Serj=-)

В общем, если жёстко, то как-то так:

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

import optparse
import re

p = optparse.OptionParser()
p.add_option("-H", action="store", type="int", dest="H")
p.add_option("-V", action="store", type="int", dest="V")

opt, args = p.parse_args()
fname = args[0]
h = opt.H
v = opt.V

with open(fname, 'r') as f:
    data = f.read()

patt = re.compile(r"""<item>
         <string name=\"Group\" value=\"TransportWindow\"/>
         <member name=\"Values\">
            <obj class=\"UPoint\" name=\"Location\" ID=\"(\d+)\">
               <int name=\"H\" value=\"\d+\"/>
               <int name=\"V\" value=\"\d+\"/>
            </obj>
         </member>
      </item>""")

ID = patt.findall(data)[0]
repl = ("""<item>
         <string name="Group" value="TransportWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="%s">
               <int name="H" value="%s"/>
               <int name="V" value="%s"/>
            </obj>
         </member>
      </item>""" % (ID, h, v))
data = patt.sub(repl, data)

with open('new.xml', 'w') as f:
    f.write(data)

Запускать так:

$ ./parser.py -H 200 -V 100 file.xml

Создаст новый файл new.xml.

Да, у меня Ubuntu.
Нет, не глючит.

15

я специально зделал две похожии секции, нужно только в одной

sudo включить компьютер

16 (09.03.2013 01:46:10 отредактировано semiono)

Питон, конечно, круто, но не под windows ab
Лучше с grep+sed помогите.

вот, например, сэд:
sed -ri "/H\" value/s/[0-9]+/91/" file.xml
но мне надо ещё в нужную секцию попасть, которая распознаётся как
<string name="Group" value="TransportWindow"/>

Вобщем grep и xargs нехватает

sudo включить компьютер

17

xxblx⇓ пишет:

Под "тупо"  подразумевается - "слишком в лоб"? Ну так и вариант этот не конкретно для xml, а по сути для любых текстовых файлов подойдет. Или есть более элегантный способ, работающий с любыми текстовыми файлами?

и в лоб... и не практично и потенциально ошибки вызывает... для любых - конечно подойдёт, а для xml - нет... см. хотя бы пример ТС... такие костыли больше геморроя вызывают, чем пользы... ещё вариант -=Serj=-'а имеет больше прав на существование... только вот надо в регулярках все пробелы сделать опциональными и произвольной длины, но после этого прочитать её сможет только обкуренный перловщик...

в принципе с xml'ем работать, как с обычным текстом в полуавтоматическом режиме ИМХО моветон...


semiono⇓ пишет:

# xml ed -u "/Defaults/list/item/string[@value=TransportWindow]/member/obj/int[@name=H]" -v 777 file.xml

путь не правильный...

вот на перловке набросал вариант:

#!/usr/bin/perl
use XML::LibXML;

my $parser = XML::LibXML->new();
my $dom = $parser->parse_file( $ARGV[0] );

my $xp_str='/Defaults/list/item[string[@value=\'TransportWindow\']]/member/obj/int[@name=\'H\']/@value';

${$dom->documentElement()->findnodes($xp_str)}[0]->setValue('777');

open(my $out_fh, '>:raw', "out.xml") or die $!;
print($out_fh $dom->toString());
95% процентов проблем находятся между клавиатурой и стулом.

18 (09.03.2013 10:53:20 отредактировано -=Serj=-)

Fat-Zer⇓ пишет:

только вот надо в регулярках все пробелы сделать опциональными и произвольной длины, но после этого прочитать её сможет только обкуренный перловщик...

Ну да, это упрощённый вариант, для читабельности и по-быстрому.

Fat-Zer⇓ пишет:

в принципе с xml'ем работать, как с обычным текстом в полуавтоматическом режиме ИМХО моветон...

Как скажешь:) Вот вариант с использование стандартной библиотеки xml:

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

import optparse
from xml.etree.ElementTree import parse

p = optparse.OptionParser()
p.add_option("-H", action="store", type="int", dest="H")
p.add_option("-V", action="store", type="int", dest="V")

opt, args = p.parse_args()
fname = args[0]
h = str(opt.H)
v = str(opt.V)

tree = parse(fname)
items = tree.findall('.//item')

for item in items:
    if item.find('string').attrib['value'] == 'TransportWindow':
        for target in item.findall('.//int'):
            if target.attrib['name'] == "H":
                target.attrib['value'] = h
            elif target.attrib['name'] == "V":
                target.attrib['value'] = v

with open('new.xml', 'w') as f:
    tree.write(f)
Да, у меня Ubuntu.
Нет, не глючит.

19

semiono⇓ пишет:

Питон, конечно, круто, но не под windows

Нет проблем.. Забирайте - http://ubuntuone.com/1Xsb5sClTWQkcuxFZGVHTR
Запускать так-же

xparse.exe -H <значение> -V <значение> <входной файл.xml>

На выходе будет новый файл new.xml.

Да, у меня Ubuntu.
Нет, не глючит.

20

Это что весь python? ab

Наверное нужен дистрибутив, он куда-то на диск C: ссылается, хотя у меня нет диска C:

 //xpars.exe parser.py -H 200 -V 100 file.xml
Traceback (most recent call last):
  File "<string>", line 17, in <module>
  File "C:\pyinstaller-2.0\xpars2\build\pyi.win32\xpars2\out00-PYZ.pyz\xml.etree.Element
Tree", line 1183, in parse
  File "C:\pyinstaller-2.0\xpars2\build\pyi.win32\xpars2\out00-PYZ.pyz\xml.etree.Element
Tree", line 656, in parse
  File "C:\pyinstaller-2.0\xpars2\build\pyi.win32\xpars2\out00-PYZ.pyz\xml.etree.Element
Tree", line 1643, in feed
  File "C:\pyinstaller-2.0\xpars2\build\pyi.win32\xpars2\out00-PYZ.pyz\xml.etree.Element
Tree", line 1507, in _raiseerror
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 1

 //
sudo включить компьютер

21

Если питон такой маленький и шустрый, то это мне нравится! ab

sudo включить компьютер

22

-=Serj=-⇓ пишет:

Как скажешь:) Вот вариант с использование стандартной библиотеки xml:

много букв... лучше через xpath сделать, как у меня...

semiono, собственно попробуй с xmlstarlet'ом вариант с путём из моего скрипта... кавычки внутри важны, не забудь их на башевский манер переэкранировать...
лучше только его по строже сделать, чтобы имена для obj'а и member'а проверял.

95% процентов проблем находятся между клавиатурой и стулом.

23 (09.03.2013 16:48:21 отредактировано -=Serj=-)

Fat-Zer⇓ пишет:

много букв... лучше через xpath сделать, как у меня...

Тогда, как я понимаю, сторонний модуль нужен, например, lxml.

semiono⇓ пишет:

Наверное нужен дистрибутив, он куда-то на диск C: ссылается, хотя у меня нет диска C:

Стоп. Это что за извращение?

semiono⇓ пишет:

xpars.exe parser.py -H 200 -V 100 file.xml

Посто

xpars.exe -H 200 -V 100 file.xml

xpars.exe - это уже готовая программа.

Да, у меня Ubuntu.
Нет, не глючит.

24 (09.03.2013 19:12:53 отредактировано semiono)

-=Serj=-⇓ пишет:

xpars.exe - это уже готовая программа.

а где ваш скрипт тогда? хм. надо проверить, напрямую значит через параметры, ясно..
хотя H и V могут встречаться многократно..
нужно искать заголовок

grep -A 4 "TransportWindow"
<string name="Group" value="TransportWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
               <int name="H" value="321"/>
               <int name="V" value="690"/>

Стоп. Это что за извращение?

У меня на диске C: стоит CRUX, а я сейчас в Windows.
Я имел ввиду дистрибутив питона, там наверное инклюды должны быть и библиотеки.. я сам поищу.
А может и Perl под винду есть, хотя пакеты с множеством файлов неохота юзать, вот когда один ексешник это мне нравиться)
xpars.exe - пригодится в хозяйстве полюбому, спасиб!

sudo включить компьютер

25 (09.03.2013 19:37:13 отредактировано semiono)

, собственно попробуй с xmlstarlet'ом вариант с путём из моего скрипта... кавычки внутри важны, не забудь их на башевский манер переэкранировать...
лучше только его по строже сделать, чтобы имена для obj'а и member'а проверял.

Меня очень xmlstarlet разочаровал! Казалось бы вот оно то что надо!
Но он умеет только с <tag>10</tag> работать, либо переименовывать, а вот с такими данными никак
<tag neme="abc" value="10"/>
Во всяком случае я не нашёл.

Блин! Кажись нашёл! Видимо выспаться надо было вчера)

sudo включить компьютер

26 (09.03.2013 20:25:45 отредактировано semiono)

Либо это баг либо фитча.

xml ed -u "/item/int[name="H"]/@value" -v 10 z.xml

работает только в том случае если name имеет числовое значение, а не буквенное 0_0

Конечно, у них в документации id="5" ab
http://xmlstar.sourceforge.net/doc/UG/ch04s03.html
а про буквы и забыли)

sudo включить компьютер

27

semiono⇓ пишет:

работает только в том случае если name имеет числовое значение, а не буквенное 0_0

кавычки нормально поставь ли заэскейпь...

 Консоль:

alexander@goblin /tmp $ cat 1.xml |grep -C4 'name="H"'
      <item>
         <string name="Group" value="TrackEffectWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="183011808">
               <int name="H" value="1"/>
               <int name="V" value="1"/>
            </obj>
            <int name="State" value="1"/>
         </member>
--
      <item>
         <string name="Group" value="TransportWindow"/>
         <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
               <int name="H" value="321"/>
               <int name="V" value="690"/>
            </obj>
         </member>
      </item>
alexander@goblin /tmp $ xml ed -u "/Defaults/list/item[string[@value='TransportWindow']]/member/obj/int[@name='H']/@value" -v 100500 1.xml |grep -C4 'name="H"'
    <item>
      <string name="Group" value="TrackEffectWindow"/>
      <member name="Values">
        <obj class="UPoint" name="Location" ID="183011808">
          <int name="H" value="1"/>
          <int name="V" value="1"/>
        </obj>
        <int name="State" value="1"/>
      </member>
--
    <item>
      <string name="Group" value="TransportWindow"/>
      <member name="Values">
        <obj class="UPoint" name="Location" ID="215319288">
          <int name="H" value="100500"/>
          <int name="V" value="690"/>
        </obj>
      </member>
    </item>

-=Serj=-⇓ пишет:

Тогда, как я понимаю, сторонний модуль нужен, например, lxml.

должны быть встроенные средства для работы с xpath'ом... но сейчас искать лень...

95% процентов проблем находятся между клавиатурой и стулом.

28 (09.03.2013 21:00:38 отредактировано semiono)

Неужели работает! Ура! А я уже вбил письмо https://sourceforge.net/ ab

Блин, точно.. с одиночными кавычками работает! Спасибо!
Ещё вы с длиными путями помогли в квадратных скобках, я там много гадал как это записать!

А у них на форуме я видел даже -x ключ применяется, хотя из документации там чё-то невнятное было.. (-x is not implemented yet)

sudo включить компьютер

29

А всё это дело через вывод в файл > делается? Или можно исходный файл сразу отредактировать?

sudo включить компьютер

30

Fat-Zer⇓ пишет:

должны быть встроенные средства для работы с xpath'ом... но сейчас искать лень...

Да, ты прав - http://docs.python.org/2/library/xml.et … th-support

Да, у меня Ubuntu.
Нет, не глючит.