读取文件并根据多个条件剪切每一行

时间:2013-03-18 09:39:50

标签: java python perl bash

我发现很难为这个问题找到合适的标题。因此,如果它具有误导性,如果您能帮助改进它,我将不胜感激。

我已经提取了xml文件属性的值,现在我有输出,如下面的示例行所示:

category:buffer overflow  analyzer:data flow analyzer:buffer

我需要将其拆分为

category:buffer overflow
analyzer:data flow
analyzer:buffer

我不确定如何使用Java,Perl或Python完成此操作。

到目前为止,我所拥有的只是一个简单的Perl脚本,将其拆分为“:”。

所有建议都会有所帮助。

4 个答案:

答案 0 :(得分:5)

合适的正则表达式将起作用。这是Python re模块的实现:

import re

s = 'category:buffer overflow  analyzer:data flow analyzer:buffer'

print(re.findall(r"(\w+:[\w ]+)(?: |$)", s))
#prints ['category:buffer overflow ', 'analyzer:data flow', 'analyzer:buffer']

答案 1 :(得分:3)

这个 sed 单行程在这里工作:

sed -r 's/ ([^ ]+:)/\n\1/g' input

试验:

kent$  echo "category:buffer overflow  analyzer:data flow analyzer:buffer" |sed -r 's/ ([^ ]+:)/\n\1/g'                                                                     
category:buffer overflow 
analyzer:data flow
analyzer:buffer

java 行也适用于此处:

System.out.println("category:buffer overflow  analyzer:data flow analyzer:buffer".replaceAll("\\s([^\\s]+:)", "\n$1"));

另一个 python 行:

In [1]: import re

In [2]: s = 'category:buffer overflow  analyzer:data flow analyzer:buffer'                                                                                                 

In [3]: print re.sub(r"\s(?=[^\s]*:)",'\n',s)
category:buffer overflow 
analyzer:data flow
analyzer:buffer

答案 2 :(得分:1)

在Java中,这将是这样的:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Extractor {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Pattern pattern = Pattern
                .compile("(\\w+:[\\w ]+)(?: |$)");
        Matcher matcher = pattern
                .matcher("category:buffer overflow  analyzer:data flow analyzer:buffer");
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

}

答案 3 :(得分:1)

在perl:

$s = "category:buffer overflow  analyzer:data flow analyzer:buffer";
$s .= " "; 
@keyz = split(/:[A-Za-z\d\s]*\s/, $s);
print "@keyz\n";
@params = split(/[A-Za-z\d]*:/, $s);
print "@params\n";

生成数组@keyz =(“category”,“analyzer”,“analyzer”)和array @params =(“缓冲区溢出”,“数据流”,“缓冲区”)