[英]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.