删除多行中有条件重复的字符串
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);
在过滤器工具栏中,select1
来自匹配线上方的额外可见线数,输入 Cyperus esculentus
,然后按 Enter 键。
确保阻止多项更改按钮在同一个工具栏中被清除(未设置)。
Select Select 所有 和 删除 Edit 菜单(或按下 Ctrl + A, Delete在编辑器中)。
单击过滤器 工具栏中的中止 按钮。
如果您想使用宏,这里有适合您的宏:
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;
使用 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);
在过滤器工具栏中,select
1
来自匹配线上方的额外可见线数,输入Cyperus esculentus
,然后按 Enter 键。确保阻止多项更改按钮在同一个工具栏中被清除(未设置)。
Select Select 所有 和 删除 Edit 菜单(或按下 Ctrl + A, Delete在编辑器中)。
单击过滤器 工具栏中的中止 按钮。
如果您想使用宏,这里有适合您的宏:
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;