2

Как изменить порядок многострочных текстовых разделов, разделенных пробелами / переводами строк ...

... с помощью простой команды или приложения, желательно без программирования?

Я не хочу сортировки, но в обратном порядке только текстовые разделы.

Например:

A
B

0
1

X
YX
Y

HTTP
FTP

становится

HTTP
FTP

X
YX
Y

0
1

A
B

3 ответа3

2

Хотя автор не предпочитает программные решения, использование 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.

Поместите это в файл .py и вызовите его через python myscript.py .

2

tac принимает разделитель, поэтому, например, в bash вы можете сделать:

tac -s $'\n\n' foo

что приведет к немного неправильному выводу, потому что последний абзац не заканчивается двойной новой строкой. Так,

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

это, вероятно, то, что вы хотели бы. (Передайте содержимое foo и новой строки через tac , затем sed чтобы удалить последнюю строку.)

Примечание: не перенаправляйте это снова в > foo как вы можете получить пустой файл.

1

Если вы используете 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

Вероятно, не самый элегантный способ, но он справился с вашим тестовым примером.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .