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

Joa*_*mal 2 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
Run Code Online (Sandbox Code Playgroud)

我想选择每 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
Run Code Online (Sandbox Code Playgroud)

我试图为这个操作构建一个合适的正则表达式,但不知道如何开始选择每 13 到 18 行!

zx8*_*x81 6

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

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

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

解释

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

(?:[^\n]*\n){5}
Run Code Online (Sandbox Code Playgroud)

查看演示

选择[^\n]*\n任意数量的非换行符,后跟换行符。我们这样做了 5 次。您可以添加锚点、环顾四周等来执行更多操作。

例如,此正则表达式将前 3 行与后 5 行交换:

\A((?:[^\n]*\n){3})((?:[^\n]*\n){5})
Run Code Online (Sandbox Code Playgroud)

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

查看演示

你想瞄准13号线吗?第 12 场比赛,然后是 1 场比赛。您想对更多的线路进行一些操作吗?添加行,并根据需要切换捕获组。

\A((?:[^\n]*\n){12})((?:[^\n]*\n))((?:[^\n]*\n){2})
Run Code Online (Sandbox Code Playgroud)

在此示例中,第一组括号捕获 12 行,下一组括号捕获第 13 行,下一组括号捕获接下来的两行。您可以通过重新排列替换中的组来切换第 13 行和以下两行:\1\3\2

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

只需根据您的需要进行调整即可。

编辑

根据您的评论,这应该完全符合您的需要。

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

代替:\1\3\2\5\4\7\6

演示

同样的想法。这((?2))是一种避免一遍又一遍重复相同正则表达式的方法(第二组捕获括号,捕获一行)。(?2)表示“重复第 2 组中的表达式”,额外的括号将这些表达式放入第 3、4、5、6、7 组中。