gpt4 book ai didi

java - 用实际值替换字符串中的 shell 环境变量

转载 作者:行者123 更新时间:2023-11-29 08:34:53 24 4
gpt4 key购买 nike

我正在读取 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} 等USER}/${PROJECT}/data" 与来自 shell 的实际值。

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

请指教一些从字符串中获取大括号括起来的环境变量的方法,以便我可以直接使用 Map 的 get() 并替换。或者,我们欢迎任何更好的方法。

注意:提供的引用(Replace String values with value in Hash Map 让我的问题看起来重复)不是最适合我的情况。

最佳答案

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

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

它还有一个方法directly replace system properties无需显式 map 。

(对于非外部库方法,请参阅 vefthym's answer)

关于java - 用实际值替换字符串中的 shell 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44923012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com