正则表达式在一些行之间添加额外的文本行?

时间:2010-10-15 14:27:11

标签: regex replace

实际上,我有一个非常复杂的问题,但是我已经把它缩小到了一些虚拟数据最重要的部分。

说我有以下文字:

a
aa
aaa
aaaa
aaaa
aaaaa
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaa
a

我想要做的是,例如当一行4 a后跟一行1a时。我想在4行之后添加一行3 a,并在3行之后添加一行2 a。所以结果将是:

a
aa
aaa
aaaa
aaaa
aaaaa
aaaa
aaa
aa
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaa
aaaa
aaa
aa
a

我在editpad pro中试过了下面的正则表达式:

find: \r?\n(a*)aa\r?\n\1\r?\n
repl: \n\1aa\n\1a\n\1\n

但这只适用于下一行恰好比前一行少2个的时候。我知道我可以编写一堆像上面那样的正则表达式来处理2 a,3 a,4 a的差异,5个等等。但我想只有一个正则表达式。我不介意我是否必须多次运行该正则表达式..

2 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。好像我非常接近,只是在开头的断线处稍微过了一点。

find: (a*)aa\r?\n\1\r?\n
repl: \1aa\n\1a\n\1\n

这在我反复点击editpad pro中的'replace all'之后有效。我想有一个解决方案,我需要只运行一次替换,所以如果有任何进一步的想法,请告诉我

答案 1 :(得分:0)

如果将虚拟数据保存在名为file的文件中,请将以下gawk(1)程序保存为名为runme的文件,并将其作为gawk -f runme file从shell调用,它应该会产生你想要的输出。

请注意,程序会将新生成的行打印为一系列哈希值而不是a,以说明添加内容。

BEGIN { }

{
    if (NR==1) { print $0; oldrec = $0; }

    if (NR>1) {
            levelsdiff = length(oldrec) - length($0);

            if (levelsdiff>1) { 
                    newrecs = levelsdiff - 1;
                    i = 1;
                    while (newrecs>0) {
                            newline = "";
                            hashes = length(oldrec) - i;
                            while (hashes!=0) {
                                    newline = newline "#";
                                    hashes--;
                            }
                            print newline;
                            i++; newrecs--;
                    }
            }

            if (levelsdiff<1) { 
                    newrecs = -levelsdiff - 1;
                    i = 1;
                    while (newrecs>0) {
                            newline = "";
                            hashes = length(oldrec) + i;
                            while (hashes!=0) {
                                    newline = newline "#";
                                    hashes--;
                            }
                            print newline;
                            i++; newrecs--;
                    }
            }

            print $0;
            oldrec = $0;
    }
}

END { }

输出:

a
aa
aaa
aaaa
aaaa
aaaaa
####
###
##
a
aa
aaa
aaaa
aaaaa
aaaaaa
#####
aaaa
###
##
a