Предполагая, что XML правильно сформирован, следующее удалит строку /test/src/repos/emp.deploy/
из значений каждого узла File
, содержащего эту строку, и строку .idt
с помощью XMLStarlet (или, скорее, оставит бит значения, следующего за путем):
xmlstarlet ed -u '//File[contains(., "/test/src/repos/emp.deploy/") and contains(., ".idt")]' \
-x 'substring-after(., "/test/src/repos/emp.deploy/")' file.xml
Добавление узла root
в ваш пример документа и выполнение приведенной выше команды генерирует
<?xml version="1.0"?>
<root>
<Application Name="empBnf" ServiceType="SOAP" BitMode="32" Path="/test/bin"/>
<FileList>
<File>emptest1.idt</File>
<File>emptest2.idt</File>
<File>emptest3.idt
</File>
<File>/test/src/repos/emp.deploy/emptest.wsdl</File>
</FileList>
<Service Qualifier="http://www.mytest.com/test/empbnf" Name="/test/src/repos/empBnf" XManagement="Container">
<Operation>Operation</Operation>
</Service>
</root>
Было бы еще лучше, если бы работало следующее:
xmlstrlet ed -u '//File[contains(., ".idt")]' \
-x 'replace(.,".*/","")' file.xml
... но XMLStarlet (в моей системе ), похоже, не хочет знать о функции replace()
.
Удаление iPython с помощью brew и повторная установка с помощью pip3 завершились тем, что помогли (после перезапуска терминала ).