我有一些包含以下数据的大型文本文件:
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行开始!!
答案 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))
同样的想法。 \1\3\2\5\4\7\6
是避免重复使用相同正则表达式的方法(第二组捕获括号,捕获一行)。 ((?2))
说“重复第2组中的表达式”,额外的括号将这些表达式分为3,4,5,6,7组。