Notepad ++逐步替换

时间:2011-09-29 20:07:48

标签: regex notepad++ sequential

假设我想拥有10行数据,但我想为每行或每段数据增加一个值。如何增加该值?

例如....如果我有这些行,是否有一种正则表达式替换id值来递增?

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

---这就是我希望它看起来像......(如果第一行的id上升就可以了)

<row id="1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5" />

8 个答案:

答案 0 :(得分:148)

不确定正则表达式,但有一种方法可以在Notepad ++中执行此操作,尽管它不是很灵活。

在您提供的示例中,按住Alt并选择您要更改的数字列。然后转到Edit->Column Editor并在出现的窗口中选择Number to Insert单选按钮。然后指定您的初始数字和增量,然后单击“确定”。它应该写出递增的数字。

注意:这也适用于Multi-editing功能(在按住 Ctrl 键的同时选择多个位置)。

然而,这并不是大多数人认为有用的灵活性。 Notepad ++很棒,但是如果你想要一个真正强大的编辑器可以轻松地做这样的事情,我会说使用Vim。

答案 1 :(得分:14)

我今天正在寻找相同的功能,但在Notepad ++中无法做到这一点。但是,我们有TextPad来救援。它对我有用。

在TextPad的替换对话框中,启用正则表达式;然后你可以尝试替换

<row id="1"/>

通过

<row id="\i"/>

查看此链接,了解TextPad的更多惊人替换功能 - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/

答案 2 :(得分:5)

由于实际答案有限,我将分享此解决方法。对于非常这样的简单案例,您可以向后执行...

从此

1
2
3
4
5

\r\n替换为" />\r\n<row id=",您将获得90%的回合

1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5

或者是类似的方式,您可以使用excel /电子表格来破解数据。只需将原始数据拆分为列并根据需要操作值。

|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |

明显的东西,但它可以帮助某人做奇怪的一次性黑客工作,以节省一些关键的笔画。

答案 3 :(得分:4)

http://docs.notepad-plus-plus.org/index.php/Inserting_Variable_Text

Notepad ++配备了编辑 - &gt;列“Alt + C”编辑器,可以通过两种不同的方式处理矩形选择:Coledit.png 在插入点(也称为插入符号)的列上的每一行(包括当前行)上插入一些固定文本。最初选择的文本保持不变。 如图所示,可以以相同的方式插入一系列线性数字。将提供起始值和增量。使用零填充左边填充是一个选项,可以在基数2,8,10或16中输入数字 - 这也是计算值的显示方式,填充基于最大值。

答案 4 :(得分:3)


上述建议的解决方案仅在数据对齐时才有效。
使用PythonScript Notepad ++插件查看链接中的解决方案,它非常棒!

stackoverflow Find/Replace but Increment Value

答案 5 :(得分:3)

我遇到了超过250行的同样问题,这就是我的做法:

例如:

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

你把光标放在“1”之后,然后你点击alt + shift并开始用向下箭头下降,直到你到达底线,现在你看到一组选择点击擦除以删除数字1每条线同时转到Edit -> Column Editor并选择Number to Insert,然后将1放在初始数字字段中,1按字段递增并检查零数字,然后点击ok

恭喜你这样做了:)

答案 6 :(得分:2)

(发布以防有人可能使用它)。

我一直在寻找一个比OP更复杂的问题的解决方案 - 用数字递增的数字替换每个出现的数字

E.g。替换这样的东西:

<row id="1" />
<row id="2" />
<row id="1" />
<row id="3" />
<row id="1" />

由此:

<row id="2" />
<row id="3" />
<row id="2" />
<row id="4" />
<row id="2" />

无法在线找到解决方案,所以我在groovy中编写了自己的脚本(有点难看但是做了工作):

 /**
 * <p> Finds words that matches template and increases them by 1.
 * '_' in word template represents number.
 *
 * <p> E.g. if template equals 'Row="_"', then:
 * ALL Row=0 will be replaced by Row="1"
 * All Row=1 will be replaced by Row="2"
 * <p> Warning - your find template might not work properly if _ is the last character of it
 * etc.
 * <p> Requirments:
 * - Original text does not contain tepmlate string
 * - Only numbers in non-disrupted sequence are incremented and replaced
 * (i.e. from example below, if Row=4 exists in original text, but Row=3 not, than Row=4 will NOT be 
 * replaced by Row=5)
 */
def replace_inc(String text, int startingIndex, String findTemplate) {
    assert findTemplate.contains('_') : 'search template needs to contain "_" placeholder'
    assert !(findTemplate.replaceFirst('_','').contains('_')) : 'only one "_" placeholder is allowed'
    assert !text.contains('_____') : 'input text should not contain "______" (5 underscores)'
    while (true) {
        findString = findTemplate.replace("_",(startingIndex).toString())
        if (!text.contains(findString)) break;
        replaceString = findTemplate.replace("_", "_____"+(++startingIndex).toString())
        text = text.replaceAll(findString, replaceString)
    }
    return text.replaceAll("_____","") // get rid of '_____' character
}

// input
findTemplate = 'Row="_"'
path = /C:\TEMP\working_copy.txt/
startingIndex = 0

// do stuff
f = new File(path)
outText = replace_inc(f.text,startingIndex,findTemplate)
println "Results \n: " + outText
f.withWriter { out -> out.println outText }
println "Results written to $f"

答案 7 :(得分:1)

如果将值存储在文件 input.txt 中,则可以通过regex和foreach循环使用Powershell执行此操作:

$initialNum=1; $increment=1; $tmp = Get-Content input.txt | foreach {  $n = [regex]::match($_,'id="(\d+)"').groups[1
].value; if ($n) {$_ -replace "$n", ([int32]$initialNum+$increment); $increment=$increment+1;} else {$_}; }

之后,您可以使用$tmp > result.txt将$ tmp存储在文件中。这不需要数据列。