Как инвертировать порядок разделов многострочного текста, разделенных пустыми новыми строками/разрывами строки...
..., с простой командой или приложением, предпочтительно без программирования?
Я не хочу вид, но обратный порядок текста разделяет только.
Например:
A
B
0
1
X
YX
Y
HTTP
FTP
становится
HTTP
FTP
X
YX
Y
0
1
A
B
tac
принимает разделитель, таким образом, в, например. bash
можно сделать:
tac -s $'\n\n' foo
который произведет немного неправильный вывод, потому что последний абзац не завершается двойной новой строкой. Так,
(cat foo; echo) | tac -s $'\n\n' | sed '$d'
вероятно, что Вы хотели бы. (Содержание канала foo
и новая строка через tac
, затем sed
разделять последнюю строку.)
Примечание: Не перенаправляйте это в > foo
снова, поскольку Вы могли закончить с пустым файлом.
Хотя автор не предпочитает программировать решения, использование Python было бы довольно легко в 1 строке:
open('output.txt', 'w').write('\n\n'.join(reversed(open('input.txt', 'r').read().split('\n\n'))))
Очевидно, замена input.txt
и output.txt
с желаемыми файлами и изменением \n
кому: \r\n
для файлов форматированного текста Windows.
Поместите это в a .py
файл и вызов это через python myscript.py
.
При использовании 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
Вероятно, не самый изящный путь, но это сделало задание с Вашим тестовым сценарием.