如何在记事本++中选择每个第n行并将每个连续行交换到下一行

时间:2014-05-15 02:56:18

标签: regex notepad++

我有一些包含以下数据的大型文本文件:

    2.086
    0.019
    2.181
    0.004
    2.308
    0.005
    2.165
    0.023
    2.113
    0.004
    2.022
    0.005
    0.013
    0.033
    0.005
    0.026
    0.009
    0.037

我想选择每第13行并将连续的行相互交换到第18行。所需的输出应如下所示:

    2.086
    0.019
    2.181
    0.004
    2.308
    0.005
    2.165
    0.023
    2.113
    0.004
    2.022
    0.005
    0.033
    0.013
    0.026
    0.005
    0.037
    0.009

我正在尝试为此操作构建一个合适的正则表达式,但不确定如何从选择每个第13到第18行开始!!

1 个答案:

答案 0 :(得分:4)

编辑:在评论和聊天中讨论之后,首先是解决方案。解释如下。

搜索:(([^\n]*\n){12})((?2))((?2))((?2))((?2))((?2))((?2))

替换:\1\4\3\6\5\8\7

<强>解释

这里是选择5行的一般方法:

(?:[^\n]*\n){5}

请参阅demo

[^\n]*\n选择任意数量的非换行符,后跟换行符。我们这样做了5次。您可以添加锚点,外观等等来完成更多工作。

例如,这个正则表达式将前3行换成下一个5:

\A((?:[^\n]*\n){3})((?:[^\n]*\n){5})

这里要理解的关键是将线组捕获到第1组和第2组。这是通过将每个表达式括在捕获括号中来完成的。稍后,在替换中,如演示所示,这些组可以按其编号引用,例如:{1}}用于组1,依此类推。

请参阅demo

你想定位第13行吗?匹配12,然后1.你想用更多的线做一些事情?添加行,并根据需要切换捕获组。

\1

在此示例中,第一组括号捕获12行,下一行捕获第13行,下一行捕获以下两行。您可以通过重新排列替换中的组来切换第13行和以下两行:\A((?:[^\n]*\n){12})((?:[^\n]*\n))((?:[^\n]*\n){2})

您想在文件中多次执行此操作吗?不要锚。这是一个demo,每隔5行用第6和第7行交换。

只需根据您的需求进行调整。

编辑

根据您的意见,这应该完全符合您的要求。

搜索:\1\3\2

替换:((?:[^\n]*\n){12})((?:[^\n]*\n))((?2))((?2))((?2))((?2))((?2))

Demo

同样的想法。 \1\3\2\5\4\7\6是避免重复使用相同正则表达式的方法(第二组捕获括号,捕获一行)。 ((?2))说“重复第2组中的表达式”,额外的括号将这些表达式分为3,4,5,6,7组。