1

我想从脚本中获取信息,所以我使用了这个函数

public static HashMap<String, String> getEnvVariables(String scriptFile,String config) {
    HashMap<String, String> vars = new HashMap<String, String>();
    try {

        FileInputStream fstream = new FileInputStream(scriptFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
        String strLine;
                          String var= "if [ \"$1\" = \""+config +"\" ] ; then";
        // Read File Line By Line
        while ((strLine = br.readLine()) != null) {
            // use a Scanner to parse the content of each line
            // exclude concatenated variables (export xx:$xx)
            if (strLine.startsWith("export") && !strLine.contains("$")) {
                strLine = strLine.substring(7);
                Scanner scanner = new Scanner(strLine);
                scanner.useDelimiter("=");
                if (scanner.hasNext()) {
                    String name = scanner.next();
                    String value = scanner.next();
                    System.out.println(name+"="+value);
                    vars.put(name, value);
                }
            }
        }

但是我想从一个特定的行开始阅读

if [ \"$1\" = \""+config +"\" ] ; then

问题是当一行以空格开头时,程序认为文件已经结束!那么我该如何修复它并使程序解析到文件末尾?考虑到该行可能以不止一个空格开头 thx

4

4 回答 4

2

您可以尝试从每一行修剪不相关的空格?

while ((strLine = br.readLine().trim()) != null) {...}

编辑:不要那样做(感谢 Joop Eggen!),否则你会有一个不错的 NPE ......)。尝试:

while ((strLine = br.readLine()) != null) {
    strLine = strLine.trim();
    ...
}
于 2013-07-17T11:29:13.100 回答
1

听起来你应该使用正则表达式(例如使用String.matches()方法)。他们还可以提取字符串或子字符串(参见:另一篇 Stackoverflow 文章)。

Lars Vogella 还对Java 中的正则表达式进行了精彩的介绍。Oracle 还编写了关于该主题的教程/课程。

可能这个片段有点帮助(使用org.apache.commons.io.LineIterator):

public void grepLine(File file, String regex)
{
    LineIterator it = FileUtils.lineIterator(file, "UTF-8");
    try
    {
        while (it.hasNext())
        {
            String line = it.nextLine();
            if(line.matches(regex))
            {
                    //...do your stuff
            }
        }
    }
    finally
    {
        LineIterator.closeQuietly(it);
    }
}

正则表达式可能类似于(注意:尚未检查它 - 尤其是反斜杠):

String regex="^\\s*if\\s+\\[\\s+\\\"\\$1\\\" = \\\""+config +"\\\" \\] ; then";
于 2013-07-17T11:43:28.867 回答
0

我找到了与您分享的解决方案。

public static HashMap<String, String> getEnvVariables(String scriptFile ,String config1,String config2) {
    HashMap<String, String> vars = new HashMap<String, String>();
    BufferedReader br = null;
    try {
        FileInputStream fstream = new FileInputStream(scriptFile);
        br = new BufferedReader(new InputStreamReader(fstream));
        String strLine = null;
        String stopvar = config2;
        String startvar =config1;
        String keyword = "set";
        do {
            if (strLine != null && strLine.contains(startvar)) {
                if (strLine.contains(stopvar)) {
                    return vars;
                }
                while (strLine != null && !strLine.contains(stopvar)) {
                    strLine = br.readLine();
                    if (strLine.trim().startsWith(keyword)&& !strLine.contains("$")) {
                        strLine = strLine.trim().substring(keyword.length())
                        .trim();
                        String[] split = strLine.split("=");
                        String name = split[0];
                        String value = split[1];
                        System.out.println(name + "=" + value);
                        vars.put(name, value);
                    }
                }
            }
        } while ((strLine = br.readLine()) != null);
    } catch (Exception e) {
        Status status = new Status(Status.ERROR, Activator.PLUGIN_ID,
                IStatus.ERROR, e.getMessage(), e);
        Activator.getDefault().getLog().log(status);
    }
    return vars;
}

感谢您的帮助!

于 2013-07-23T08:11:43.657 回答
0

最重要的是:省略 DataInputStream,更多 Java 对象特定。

boolean started = false;
while ...
    if (!started) {
        started = strLine.matches("\\s*...\\s*");
    } else {
        ...

Reg ex\\s*代表零个或多个空白字符(制表符、空格)。

于 2013-07-17T11:30:27.867 回答