Предположим, что файл XML выглядит примерно так
XMLStarlet сможет разобрать два centerline
узла, у которых нет атрибута id
, начинающегося со строкиsid
:
$ xmlstarlet sel -t -c '//centerline[starts-with(@id,"sid") = false]' -nl file.xml
Запрос XPath //centerline[starts-with(@id,"sid") = false]
означает «соответствие каждому centerline
, чей атрибут id
не начинается со строки sid
в любом месте документа». С помощью -c
в командной строке xmlstarlet
мы запрашиваем копию узлов, соответствующих запросу.
Просто чтобы показать, что xmlstarlet
немного мощнее, чем простое извлечение элементов между тегами:
Чтобы получить значения x
и y
узлов point
в этих структурах centerline
(с соответствующим префиксомcenterline
id
):
$ xmlstarlet sel -t -m '//centerline[starts-with(@id,"sid") = false]/polyline/point' \
-v 'concat(../../@id, ":", @x, ",", @y)' -nl file.xml
star12L:487610.06,2803975.46
star12L:501348.98,2795594.35
star12R:487610.06,2803975.46
star12R:501348.98,2795594.35
-m
заставляет xmlstarlet
соответствовать только заданным узлам (узлам polyline/point
под не -исключенными centerline
узлами ), в то время как следующие -v
запрос получает значения, составленные с помощью concat()
. concat()
объединяет («соединяет» )строки, которые мы хотели бы получить для каждого совпавшего point
узла(../../@id
ссылается на атрибут id
в узле centerline
).
Возможно, это не самый эффективный способ сделать это, но вот то, что вы спросили.
Во-первых, вам нужен список файлов в архиве. Вы можете получить его с помощью 7za l
. Существует недокументированный переключатель -ba
, который упрощает обработку вывода . Мы можем взять последний столбец этого вывода, который содержит имена заархивированных файлов, с awk '{print $NF}'
. Чтобы получить вывод команды в виде значений в вашем скрипте, мы можем использовать подстановку команды с синтаксисом $()
.
Вы можете использовать команду e
вместо x
в вашей команде извлечения файлов 7za
, потому что вы берете только файлы и не нуждаетесь в какой-либо структуре каталогов из архива. Не забудьте указать имя архива в качестве аргумента.
Следуя вышеизложенному, сценарий будет примерно таким:
#!/bin/bash
for file in $(7za l -ba compressed.7z | awk '{print $NF}')
do
7za x -ooutput compressed.7z "$file"
java -jar Remove_BoilerPlate_JSON_Updated.jar output/"$file"
done