如何使用 JSch exec 获取存储在不同文件(同一目录)中的占位符值
How to get the placeholder's value which is stored in a different file (same directory) using JSch exec
具备条件:
我无法使用任何 XML 解析器工具,因为我没有权限,只读
我的xmllint版本不支持xpath,无法更新,只读
我没有 xmlstarlet,无法安装
我 运行 我的脚本使用 Java JSch exec 通道(我必须 运行 在这里)
所以我们在一个目录中有 3 个文件。
sample.xml
values1.properties
values2.properties
文件内容如下:
Sample.xml
<block>
<name>Bob</name>
<address>USA</address>
<email>$BOB_EMAIL</email>
<phone>1234567</phone>
</block>
<block>
<name>Peter</name>
<address>France</address>
<cell>123123123</cell>
<drinks>Coke</drinks>
<car>$PETER_CAR</car>
<bike>Mountain bike</bike>
</block>
<block>
<name>George</name>
<hobby>$GEORGE_HOBBY</hobby>
<phone>$GEORGE_PHONE</phone>
</block>
values1.properties
JOE_EMAIL=joe@google.com
BOB_EMAIL=bob@hotshot.com
JACK_EMAIL=jack@jill.com
MARY_EMAIL=mary@rose.com
PETER_EMAIL=qwert1@abc.com
GEORGE_PHONE=Samsung
values2.properties
JOE_CAR=Honda
DAISY_CAR=Toyota
PETER_CAR=Mazda
TOM_CAR=Audi
BOB_CAR=Ferrari
GEORGE_HOBBY=Tennis
我使用此脚本将 xml 块转换为属性文件格式
NAME="Bob"
sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/=/p' sample.xml
输出:
name=Bob
address=USA
email=$BOB_EMAIL
phone=1234567
如何在 values1.properties
和 values2.properties
中获取 $BOB_EMAIL
的值。假设我不知道它位于两个(或可能更多)属性文件之间的什么位置。因为如果我输入
它应该会有所不同
Name=Peter
在脚本中,应该得到
name=Peter
address=France
cell=123123123
drinks=Coke
car=$PETER_CAR
bike=Mountain bike
将被搜索的想法将是 PETER_CAR
EXPECTED OUTPUT(用户只需一次输入1个名称,预期输出是一组属性格式的数据,$PLACEHOLDER替换为属性文件中的值):
用户输入:Name=Bob
name=Bob
address=USA
email=bob@hotshot.com
phone=1234567
用户输入:Name=Peter
name=Peter
address=France
cell=123123123
drinks=Coke
car=Mazda
bike=Mountain bike
最终,我需要的脚本逻辑是这样的:
- 每个单词
$
- 在
sed -n '/name>'${name}'/,/<\/block>/s/.*<(.*)>(.*)<.*/=/p' sample.xml
的结果中,
- 它将在该目录的所有属性文件(或指定的属性文件)中搜索该词的值,
- 然后将
$
中的单词替换为在属性文件中找到的值
部分工作答案:
Walter A 的回答在 cmd 行 (putty) 中有效,但在 Jsch exec 中无效。
我不断收到 No value found for token 'var'
的错误。
下面的解决方案会在属性文件中查找很多次,所以我认为有一个更快的解决方案。
下面的解决方案将帮助您入门,并且您可能会对小文件感到满意。
# Question has a bash en ksh tag, choose the shebang line you want
# Make sure it is the first line without space or ^M after it.
#!/bin/ksh
#!/bin/bash
# Remove next line (debugging) when all is working
# set -x
for name in Bob Peter; do
sed -n '/name>'${name}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/=/p' sample.xml |
while IFS="$" read line var; do
if [ -n "${var}" ]; then
echo "${line}$(grep "^${var}=" values[12].properties | cut -d= -f2-)"
else
echo "${line}"
fi
done
echo
done
编辑:评论了两条可能的 shebang 行,set -x
并添加了输出。
结果:
name=Bob
address=USA
email=bob@hotshot.com
phone=1234567
name=Peter
address=France
cell=123123123
drinks=Coke
car=Mazda
bike=Mountain bike
. values1.properties
. values2.properties
sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/echo =""/p' sample.xml >output
. output
危险,而且不是我喜欢的方式。
基于 sed 的版本:
$ temp_properties=`mktemp`
$ NAME=Bob
$ sed '/./{s/^/s|$/;s/=/|/;s/$/|g/}' values*.properties > $temp_properties
$ sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/=/p' sample.xml | sed -f $temp_properties
给出:
name=Bob
address=USA
email=bob@hotshot.com
phone=1234567
它确实存在脚本注入问题。但是,如果您信任 values*.properties
文件和 NAME
变量的内容,那么您就可以开始了。
具备条件:
我无法使用任何 XML 解析器工具,因为我没有权限,只读
我的xmllint版本不支持xpath,无法更新,只读
我没有 xmlstarlet,无法安装
我 运行 我的脚本使用 Java JSch exec 通道(我必须 运行 在这里)
所以我们在一个目录中有 3 个文件。
sample.xml
values1.properties
values2.properties
文件内容如下:
Sample.xml
<block>
<name>Bob</name>
<address>USA</address>
<email>$BOB_EMAIL</email>
<phone>1234567</phone>
</block>
<block>
<name>Peter</name>
<address>France</address>
<cell>123123123</cell>
<drinks>Coke</drinks>
<car>$PETER_CAR</car>
<bike>Mountain bike</bike>
</block>
<block>
<name>George</name>
<hobby>$GEORGE_HOBBY</hobby>
<phone>$GEORGE_PHONE</phone>
</block>
values1.properties
JOE_EMAIL=joe@google.com
BOB_EMAIL=bob@hotshot.com
JACK_EMAIL=jack@jill.com
MARY_EMAIL=mary@rose.com
PETER_EMAIL=qwert1@abc.com
GEORGE_PHONE=Samsung
values2.properties
JOE_CAR=Honda
DAISY_CAR=Toyota
PETER_CAR=Mazda
TOM_CAR=Audi
BOB_CAR=Ferrari
GEORGE_HOBBY=Tennis
我使用此脚本将 xml 块转换为属性文件格式
NAME="Bob"
sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/=/p' sample.xml
输出:
name=Bob
address=USA
email=$BOB_EMAIL
phone=1234567
如何在 values1.properties
和 values2.properties
中获取 $BOB_EMAIL
的值。假设我不知道它位于两个(或可能更多)属性文件之间的什么位置。因为如果我输入
Name=Peter
在脚本中,应该得到
name=Peter
address=France
cell=123123123
drinks=Coke
car=$PETER_CAR
bike=Mountain bike
将被搜索的想法将是 PETER_CAR
EXPECTED OUTPUT(用户只需一次输入1个名称,预期输出是一组属性格式的数据,$PLACEHOLDER替换为属性文件中的值):
用户输入:Name=Bob
name=Bob
address=USA
email=bob@hotshot.com
phone=1234567
用户输入:Name=Peter
name=Peter
address=France
cell=123123123
drinks=Coke
car=Mazda
bike=Mountain bike
最终,我需要的脚本逻辑是这样的:
- 每个单词
$
- 在
sed -n '/name>'${name}'/,/<\/block>/s/.*<(.*)>(.*)<.*/=/p' sample.xml
的结果中, - 它将在该目录的所有属性文件(或指定的属性文件)中搜索该词的值,
- 然后将
$
中的单词替换为在属性文件中找到的值
部分工作答案:
Walter A 的回答在 cmd 行 (putty) 中有效,但在 Jsch exec 中无效。
我不断收到 No value found for token 'var'
的错误。
下面的解决方案会在属性文件中查找很多次,所以我认为有一个更快的解决方案。
下面的解决方案将帮助您入门,并且您可能会对小文件感到满意。
# Question has a bash en ksh tag, choose the shebang line you want
# Make sure it is the first line without space or ^M after it.
#!/bin/ksh
#!/bin/bash
# Remove next line (debugging) when all is working
# set -x
for name in Bob Peter; do
sed -n '/name>'${name}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/=/p' sample.xml |
while IFS="$" read line var; do
if [ -n "${var}" ]; then
echo "${line}$(grep "^${var}=" values[12].properties | cut -d= -f2-)"
else
echo "${line}"
fi
done
echo
done
编辑:评论了两条可能的 shebang 行,set -x
并添加了输出。
结果:
name=Bob
address=USA
email=bob@hotshot.com
phone=1234567
name=Peter
address=France
cell=123123123
drinks=Coke
car=Mazda
bike=Mountain bike
. values1.properties
. values2.properties
sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/echo =""/p' sample.xml >output
. output
危险,而且不是我喜欢的方式。
基于 sed 的版本:
$ temp_properties=`mktemp`
$ NAME=Bob
$ sed '/./{s/^/s|$/;s/=/|/;s/$/|g/}' values*.properties > $temp_properties
$ sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/=/p' sample.xml | sed -f $temp_properties
给出:
name=Bob
address=USA
email=bob@hotshot.com
phone=1234567
它确实存在脚本注入问题。但是,如果您信任 values*.properties
文件和 NAME
变量的内容,那么您就可以开始了。