我有以下xml文件
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>jdbc/pvhrm_CC_tu</jndi-name>
<connection-url>jdbc:db2:CCTST1</connection-url>
</local-tx-datasource>
<local-tx-datasource>
<jndi-name>jdbc/pvhrm_SLB_tu</jndi-name>
<connection-url>jdbc:db2:slbtst1</connection-url>
</local-tx-datasource>
</datasources>
我想知道使用shell脚本的特定jndi-name的connection-url。 假设输入是jdbc / pvhrm_CC_tu然后我想要dbc:db2:CCTST1作为输出。 我是UNIX的新手。我尝试了xmllint --xpath,但是找不到xpath选项的错误。 还有其他选择。
答案 0 :(得分:0)
这些行可以帮到你:
编辑:
parameter=$(echo "YOURPARAMETER" | sed "s/\//\\\\\//g") #e.g. : jdbc/pvhrm_CC_tu
cat YOURXMLFILE| tr '\n' ' ' | sed "s/^.*<jndi-name>$parameter<\/jndi-name>[ ]*<connection-url>\(.\{14,17\}\)<\/connection-url>.*/\1\n/g"
用某些词语:
- 输入你的参数:你的jndi-name;第一个sed表达式将逃脱斜线
- tr表达式将全部放在一条线上
- sed表达式将替换&#34; jdbc / pvhrm_CC_tu
JDBC:DB2:CCTST1&#34;通过jdbc:db2:CCTST1,如果它是正确的。
此表达式适用于连接网址,其长度介于14和17个字符之间
答案 1 :(得分:0)
您可以安装XMLStarlet,之后您可以执行以下操作:
xmlstarlet sel -t -v "//jndi-name[. = 'jdbc/pvhrm_CC_tu']/following-sibling::connection-url" myfile.xml
或者,您可以安装具有--xpath
选项的较新版libxml2。
答案 2 :(得分:0)
使用XMLStarlet:
name=jdbc/pvhrm_CC_tu # example value
[[ $name = *"'"* ]] && { echo "ERROR: Injection attempt" >&2; exit 1; }
xmlstarlet sel \
-t -m "//datasources[jndi-name='$name']/connection-url" -v . \
<input.xml
这里的注入检查可能过多,但无论何时将数据替换为代码,都是一个好习惯。 (设计得更好的界面根本不允许这样的替换,但总是将扩展视为数据而不是代码)。