-1

使用 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);
4

1 回答 1

1
  1. 过滤器工具栏中,1匹配线上方的附加可见线数中选择,输入Cyperus esculentus,然后按Enter键。

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

  3. 编辑菜单上选择全选并删除(或在键盘焦点位于编辑器中时按+ )。CtrlADelete

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

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

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然后从菜单中的选择...中选择此文件。最后,打开您的数据文件,并在数据文件处于活动状态时选择菜单中的运行。确保在运行宏之前清除阻止多项更改按钮。

参考:EmEditor 宏参考:过滤器集合

更新

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

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;
于 2021-01-26T16:21:02.160 回答