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 の正規表現に関する優れた紹介もあります。オラクルは、そのトピックに関するチュートリアル/レッスンもまとめました。

このスニペットが少し役立つかもしれません ( 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 {
        ...

正規\\s*表現は、0 個以上の空白文字 (タブ、スペース) を表します。

于 2013-07-17T11:30:27.867 に答える