繁体   English   中英

用实际值替换字符串中的Shell环境变量

[英]Replace shell environment variables in a string with actual values

我正在读取Java中的属性文件。

Properties myProp = new Properties();
InputStream in = new FileInputStream(pathOfPropertyFile);
myProp.load(in);
in.close();

属性文件中的值引用了Linux Shell变量。 例如,属性文件中的条目可能如下所示:

DATA_PATH=/data/${PROJECT}/${YEAR}${MONTH}${DAY}

我必须从Java执行Shell脚本,因此我具有ProcessBuilder实例以及环境变量(如下所示的envMap ):

List<String> command = new ArrayList<String>();
command.add(actualCommand);
command.add(param1);
command.add(param2);
ProcessBuilder processBuilder = new ProcessBuilder(command);
Map<String, String> envMap = processBuilder.environment();

envMap具有我需要的环境变量以及一百个(> 100)我不需要的其他环境变量。

我想用外壳程序中的实际值替换属性值字符串"/home/${USER}/${PROJECT}/data"${USER}${PROJECT}等。

我认为将Map作为最后一个选项进行迭代(因为Map具有要迭代的100到200个元素),因为它不是一种有效的方法。

请提供一些建议,该方法将从字符串中获取由大括号括起来的环境变量,以便我可以直接使用Map的get()并进行替换。 或者,最好欢迎任何更好的方法。

注意:提供的引用( 用哈希表中的值替换字符串值使我的问题看上去重复)不是我的最佳选择。

如果您愿意使用外部库, StrSubstitutor apache-commons的StrSubstitutor将完全按照您的要求进行操作:

public static void main(String[] args) {
    String input = "DATA_PATH=/data/${PROJECT}/${YEAR}${MONTH}${DAY}";
    Map<String, String> env = new HashMap<>();
    env.put("PROJECT", "myProject");
    env.put("YEAR", "2017");
    env.put("MONTH", "7");
    env.put("DAY", "5");
    env.put("OTHER_VALUE", "someOtherValue");
    System.out.println(StrSubstitutor.replace(input, env));
}

输出:

DATA_PATH=/data/myProject/201775

它还具有一种无需显式映射即可直接替换系统属性的方法。

(对于非外部库方法,请参见vefthym的答案

我不确定它是否有效,但是我希望有人可以对其进行编辑以使其起作用,或者至少您能理解并使其独立工作:

command = command.replaceAll("\\$\\{(.*?)\\}", envMap.get("$1"));

在这里,我假设command是一个字符串(不是列表),并且所有环境变量都存在于您的Map中(否则,您应该检查null并根据需要处理这种情况)。

有点解释:

此正则表达式正在寻找模式“ $ {something}”,并将其替换为envMap.get("something") 在此示例中,我们使用括号将“某物”标记为一组,然后可以将其缩回为“ $ 1”(因为我们只有一组,即只有一组括号)。 问号“?” 是此处的非贪婪运算符,表示在最小的正则表达式匹配处停止(否则,它将找到第一个“ $ {”直到最后一个“}”的单一匹配)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM