如何使用 JSch exec 获取存储在不同文件(同一目录)中的占位符值



条件为:

  1. 我不能使用任何XML解析器工具,因为我没有权限,只读

  2. 我的xmllint版本不支持xpath,我无法更新它,只读

  3. 我没有xmlstarlet,无法安装它

  4. 我使用Java JSch exec通道运行我的脚本(我必须在这里运行它)

因此,我们在一个目录中有3个文件。

  1. sample.xml
  2. values1.properties
  3. 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>

值1.属性

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/.*<(.*)>(.*)<.*/1=2/p' sample.xml

输出:

name=Bob
address=USA
email=$BOB_EMAIL
phone=1234567

如何获得values1.propertiesvalues2.properties$BOB_EMAIL的值。假设我不知道它在两个(或者可能更多)属性文件之间的位置。B因为如果我进入,它的工作方式应该会有所不同

Name=Peter

在脚本中,它应该得到

name=Peter
address=France
cell=123123123
drinks=Coke
car=$PETER_CAR
bike=Mountain bike

并且将被搜索的思想将是PETER_CAR

预期输出(用户一次只需要输入1个名称,预期输出是一组属性格式的数据,$PLACEOLDER替换为属性文件中的值):

用户输入: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

最终,我需要的脚本具有以下逻辑:

  1. 对于$的每个单词
  2. 在CCD_ 11的结果中
  3. 它将在该目录中的所有属性文件(或指定的属性文件)中搜索该词的值
  4. 然后将具有$的单词替换为属性文件中的值

部分有效答案:

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/.*<(.*)>(.*)<.*/1=2/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 1="2"/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/.*<(.*)>(.*)<.*/1=2/p' sample.xml | sed -f $temp_properties

提供:

name=Bob
address=USA
email=bob@hotshot.com
phone=1234567

它确实存在脚本注入的问题。但是,如果您信任values*.properties文件&NAME变量的内容,您可以很好地去。

最新更新