实际上,我有一个非常复杂的问题,但是我已经把它缩小到了一些虚拟数据最重要的部分。
说我有以下文字:
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个等等。但我想只有一个正则表达式。我不介意我是否必须多次运行该正则表达式..
答案 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