删除多行中有条件重复的字符串

Delete conditionally repeated string in multiple lines

使用 EmEditor,我想删除一个字符串的所有重复实例,该字符串占据整行加上它上面的行。例如,在本文中,重复的字符串是 Cyperus esculentus(它可以是任何其他内容),我希望删除所有重复的实例,包括上一行,即语言代码。到目前为止,我发现的是这样的:

.{2,3} \nCyperus esculentus\n

但问题是我必须用在每个不同文本中重复的字符串替换重复的字符串。

ar 
سعد لذيذ
ast 
Cyperus esculentus
azb 
یئمه‌لی توپالاق
az 
Yeməli topalaq
bo 
ཆུ་འབྲུམ།
ca 
Xufa
ceb 
Cyperus esculentus
cs 
Šáchor jedlý
de 
Erdmandel
en 
Cyperus esculentus
eo 
Cyperus esculentus
es 
Cyperus esculentus
eu 
Bedaur
fa 
اویار سلام زرد
fr 
Souchet comestible
gl 
Xunca doce
ha 
Aya
he 
גומא נאכל
id 
Cyperus esculentus
it 
Cyperus esculentus
ja 
ショクヨウガヤツリ
la 
Cyperus esculentus
nl 
Knolcyperus
nv 
Tłʼohigaaí
pl 
Cibora jadalna
pt 
Cyperus esculentus
ru 
Чуфа
srn 
Affo
sv 
Jordmandel
th 
แห้วไทย
tr 
Yer bademi
uk 
Смикавець їстівний
uz 
Yerbodom
vi 
Củ gấu tàu
war 
Cyperus esculentus
zh 
油莎草

预期的结果是应用我上面提到的正则表达式后剩下的(澄清一下,在这些文本中只有一个字符串可以重复,所以正则表达式不必寻找多个不同的重复字符串) :

ar 
سعد لذيذ
azb 
یئمه‌لی توپالاق
az 
Yeməli topalaq
bo 
ཆུ་འབྲུམ།
ca 
Xufa
cs 
Šáchor jedlý
de 
Erdmandel
eu 
Bedaur
fa 
اویار سلام زرد
fr 
Souchet comestible
gl 
Xunca doce
ha 
Aya
he 
גומא נאכל
ja 
ショクヨウガヤツリ
nl 
Knolcyperus
nv 
Tłʼohigaaí
pl 
Cibora jadalna
ru 
Чуфа
srn 
Affo
sv 
Jordmandel
th 
แห้วไทย
tr 
Yer bademi
uk 
Смикавець їстівний
uz 
Yerbodom
vi 
Củ gấu tàu
zh 
油莎草

这对我有用

document.selection.StartOfDocument(false);
document.DeleteDuplicates("",eeIncludeAll);
document.selection.Replace("([a-z]{2,3} \n)([a-z]{2,3} \n)","\2",eeFindReplaceCase | eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("([a-z]{2,3} \n)([a-z]{2,3} \n)","\2",eeFindReplaceCase | eeReplaceAll | eeFindReplaceRegExp,0);
document.selection.Replace("([a-z]{2,3} \n)([a-z]{2,3} \n)","\2",eeFindReplaceCase | eeReplaceAll | eeFindReplaceRegExp,0);
  1. 过滤器工具栏中,select1来自匹配线上方的额外可见线数,输入 Cyperus esculentus,然后按 Enter 键。

  2. 确保阻止多项更改按钮在同一个工具栏中被清除(未设置)。

  3. Select Select 所有 删除 Edit 菜单(或按下 Ctrl + A, Delete在编辑器中)。

  4. 单击过滤器 工具栏中的中止 按钮。

如果您想使用宏,这里有适合您的宏:

fs = document.filters;
fs.Clear();
fs.AddFind( "Cyperus esculentus", eeFindReplaceCase, 0 );
fs.VisibleLinesAbove  = 1;
fs.VisibleLinesBelow  = 0;
document.filters = fs;
document.selection.SelectAll();
document.selection.Delete();
fs.Clear();
document.filters = fs;

打开数据文件后,您可以运行这个宏。为此,请将此代码保存为 Filter.jsee,然后 select 来自 Select... 的此文件 菜单。最后,打开您的数据文件,并在您的数据文件处于活动状态时,在 Macros 菜单中选择 select 运行。确保在 运行 宏之前清除 阻止多项更改 按钮。

参考文献:EmEditor Macro Reference: Filters Collection

更新

我知道“Cyperus esculentus”可以是任何其他短语。假设重复项总是出现在偶数行号处,这里是您可以使用的宏。这个宏selects所有偶数,书签在selected行中重复,并删除所有书签行(+上面一行)。确保在 运行 宏之前清除 阻止多项更改 按钮。

editor.ExecuteCommandByID(4323);  // clear all bookmarks
document.selection.StartOfDocument(false);
editor.ExecuteCommandByID(4208);  // No Wrap
nLines = document.GetLines();
document.selection.LineDown(false,1);
for( i = 0; i < nLines; i += 2 ) {
    editor.ExecuteCommandByID(4153);  // select character
    document.selection.CharRight(false,1);
    editor.ExecuteCommandByID(4153);
    document.selection.StartOfLine(false,eeLineView | eeLineHomeText);
    document.selection.LineDown(false,2);
}

document.DeleteDuplicates("",eeSortSelectionOnly | eeBookmark | eeIncludeAll);  // bookmark all duplicates in selected lines
document.selection.Collapse();

// filter bookmarked lines only
fs = document.filters;
fs.Clear();
fs.AddFind( "", 0, eeExFindBookmarkedOnly );
fs.VisibleLinesAbove  = 1;
fs.VisibleLinesBelow  = 0;
document.filters = fs;

document.selection.SelectAll();
document.selection.Delete(1);    // delete all filtered lines
fs.Clear();
document.filters = fs;