如何反转由空白换行符/换行符分隔的多行文本部分的顺序?

如何反转由空白换行符/换行符分隔的多行文本部分的顺序?

如何反转由空白换行符/换行符分隔的多行文本部分的顺序......

...,使用一个简单的命令或应用程序,最好不需要编程?

我不想要排序,而只是要按文本部分的相反顺序排列。

例如:

A
B

0
1

X
YX
Y

HTTP
FTP

变成

HTTP
FTP

X
YX
Y

0
1

A
B

答案1

tac接受分隔符,因此例如bash您可以执行以下操作:

tac -s $'\n\n' foo

这将产生稍微不正确的输出,因为最后一段不是以双换行符结束的。因此,

(cat foo; echo) | tac -s $'\n\n' | sed '$d'

可能就是您想要的。(将 的内容foo和换行符通过传输tac,然后sed删除最后一行。)

笔记:请勿> foo再次重定向此文件,否则最终可能会得到一个空文件。

答案2

尽管作者不喜欢编程解决方案,但使用 Python 只需一行即可轻松实现:

open('output.txt', 'w').write('\n\n'.join(reversed(open('input.txt', 'r').read().split('\n\n'))))

显然,用所需的文件替换input.txt和,并将Windows 格式的文本文件更改为。output.txt\n\r\n

将其放入.py文件中并通过 调用它python myscript.py

答案3

如果您使用的是 Windows,那么您可以简单地使用 Powershell。这将反转内容test.txt并将结果保存到test2.txt

$f=Get-Content c:\folder\test.txt
[array]::Reverse($f)
$f | out-file c:\folder\test2.txt

更新:

这应该可以解决问题(读取所有行test.txt并重新排列它们以test2.txt按照您想要的方式归档):

$content = [System.IO.File]::ReadAllLines("C:\Folder\test.txt")
$a = New-Object System.Collections.ArrayList
$i=0
ForEach ($line in $content) {If ($line -ne "") {$a.insert($i++, $line)} else {$a.insert(0, $line); $i=0}}
$a | out-file C:\Folder\test2.txt

这可能不是最优雅的方式,但它确实完成了您的测试用例。

相关内容