RegEx生成重复的行

时间:2013-12-05 08:58:51

标签: regex

请考虑以下几行:

mastectomy  N
master  NtVA

左边的单词与右边的一个或多个标志分开(表示相关单词的可能词性(POS),即:它是否可以是名词,动词等)两列是制表符分隔的。

我正试图通过RegEx Search& amp;在我的文本编辑器中替换:

mastectomy  N
master  N
master  t
master  V
master  A

目标是让生活更轻松,使用Excel中的列表(对于vlookups)。实际数据长度为230K行且区分大小写(从Moby List中提取。)

到目前为止,我得到的是:

[查找] ([a-z]+)\t([a-z]?)([a-z]?)([a-z]?)([a-z]?)

[替换] \1\t\2\n\1\t\3\n\1\t\4\n\1\t\5

但这不是很优雅也不灵活,并且只为只有1个标志的单词产生无用的行。

我该如何改进?

谢谢 -

法比安

3 个答案:

答案 0 :(得分:1)

你可以尝试运行这样的替换,直到没有替换。

使用表达式:

^(.+?)(\t[a-z])([a-z]+)

替换为:

\1\2\n\1\t\3

并运行它直到无法替换任何内容。

答案 1 :(得分:1)

另一种方法可能是使用脚本语言从命令行完成工作:

perl -ane '
    @f = split //, $F[1]; 
    printf qq|%s\t%s\n|, $F[0], shift @f while @f;
' infile

它产生:

mastectomy  N
master  N
master  t
master  V
master  A

答案 2 :(得分:1)

我有一个使用awk的简单解决方案:

#!/bin/gawk -f

NF==2 {
STR=$2
while(length(STR)>0){
    firstletter=substr(STR, 1, 1);
    print $1" "firstletter;
    STR=substr(STR, 2, length(STR));
}
}

给出:

[col_expand $] cat input.dat
mastectomy N
master NtVA

[col_expand $] 
[col_expand $] ./col_expand.awk input.dat
mastectomy N
master N
master t
master V
master A
[col_expand $]