示例文件:
<settings
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>fake</id>
<username>username2</username>
<password>aa2</password>
</server>
<server>
<id>fake3</id>
<username>username3</username>
<password>aa3</password>
</server>
<server>
<id>gitlab-company-name</id>
<configuration>
<httpHeaders>
<property>
<name>Private-Token</name>
<value>glpat-faketokenvalue-E</value>
</property>
</httpHeaders>
</configuration>
</server>
</servers>
<mirrors>
[parially cut]
</mirrors>
现在我想分别返回settings
-> servers
-> server
(其中id
= gitlab-company-name
)-> configuration
-> httpHeaders
-> property
->name
和value
- 的值。
我想到最好的办法是:
xmlstarlet sel -t -m '//_:server[_:id="gitlab-company-name"]' -v '_:configuration' -n ${HOME}/.m2/settings.xml
但它也会返回直到结果为止的所有空格(它们被 StackExchange 格式截断):
Private-Token
glpat-faketokenvalue-E
我将其通过管道传输到 sed 和 head/tail 但这是一个肮脏的解决方法。
有人能帮我解决这个问题吗?提前谢谢您。
答案1
例如,您可以使用:
xmlstarlet sel -t -m '//_:server[_:id="gitlab-company-name"]' -v '//_:name' -n -v "//_:value" -n ${HOME}/.m2/settings.xml
我所做的是在两个嵌套值(name
, )之间进行拆分,并且它们之间value
有一个换行符( switch)。-n
结果:
Private-Token
glpat-faketokenvalue-E
或者你也可以使用concat
ANSI C 字符串 ( $''
) 来解析换行符,假设你的 shell 支持该语法:
xmlstarlet sel -t -m '//_:server[_:id="gitlab-company-name"]' -v $'concat(//_:name, "\n", //_:value, "\n")' ${HOME}/.m2/settings.xml