Благодаря GNU awk для мультисимвольного RS для разделения файлов на допустимый XML для каждого раздела SVG, выполняется совместная обработка, позволяющая печатать записи в xmlstarlet и считывать вывод, второй аргумент - close()
, позволяющий нам закрыть канал в xmlstarlet, чтобы он обрабатывал ввод, и xmlstarlet для фактического чтения XML:
$ cat ../tst.awk
BEGIN {
RS = "</svg>[[:space:]]*"
ORS = ""
xmlParser = "xmlstarlet select -N x=\047http://www.w3.org/2000/svg\047 --template --value-of \047//x:svg/@id\047"
}
RT != "" {
$0 = $0 RT
print |& xmlParser
close(xmlParser,"to")
if ( (xmlParser |& getline id) > 0 ) {
print > (id ".svg")
}
close(xmlParser)
}
Например, где file
содержит вводимый текст вопроса:
$ ls
file tst.awk
$ awk -f tst.awk file
$ ls
file tst.awk France.svg Ireland.svg Italy.svg
$ tail -n +1 *.svg
==> France.svg <==
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" id="France" width="1500" height="1000" viewBox="0 0 3 2">
<rect width="3" height="2" fill="#009246"/>
<rect width="2" height="2" x="1" fill="#fff"/>
<rect width="1" height="2" x="2" fill="#ce2b37"/>
</svg>
==> Ireland.svg <==
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" id="Ireland" width="1200" height="600">
<rect fill="#169b62" width="1200" height="600" />
<rect fill="#fff" x="400" width="800" height="600" />
<rect fill="#ff883e" x="800" width="400" height="600" />
</svg>
==> Italy.svg <==
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" id="Italy" width="900" height="600">
<rect width="900" height="600" fill="#ED2939"/>
<rect width="600" height="600" fill="#fff"/>
<rect width="300" height="600" fill="#002395"/>
</svg>
Сбой, если бы </svg>
был внутри комментария или строки и, возможно, других контекстов, которых у вас, похоже, нет. idk, что вы хотите сделать, если в разделе XML нет id
, поэтому я просто не распечатываю XML, если это произойдет.