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

1178
XP1

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

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

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

Например:

A B  0 1  X YX Y  HTTP FTP 

становится

HTTP FTP  X YX Y  0 1  A B 
2
Извините, что я еще не принял ни одного ответа. Я отсутствовал некоторое время. Я принял решение Пета, потому что оно самое простое. Я проголосовал за все рабочие решения. Спасибо всем. XP1 13 лет назад 0

3 ответа на вопрос

2
BigChief

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

+1, мне нравится однострочник. Python действительно позволяет некоторые интересные вещи Siim K 13 лет назад 0
2
peth

tac accepts a separator, so in e.g. bash you can do:

tac -s $'\n\n' foo 

which will produce slightly incorrect output because the last paragraph isn't terminated by a double newline. So,

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

is probably what you'd want. (Pipe contents of foo and newline through tac, then sed to strip the last line.)

Note: Do not redirect this into > foo again as you could end up with an empty file.

+1. Оно работает. Для дальнейшего использования «foo» - это имя файла. Для вывода в файл я просто перенаправил его в новый файл с помощью этой команды: "(cat foo; echo) | tac -s $ '\ n \ n' | sed '$ d'> foo1.txt". XP1 13 лет назад 0
1
Siim K

If you're using Windows then you could simply use Powershell. This reverses the contents of test.txt and saves the result to test2.txt:

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

Update:

This should do the trick (reads all the lines from test.txt and rearranges them to test2.txt file the way you wanted):

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

Probably not the most elegant way but it did the job with your test case.

К сожалению, команда также меняет порядок отдельных строк в текстовых разделах, что мне не нужно. Например, порядок для «A, B» становится «B, A», где запятая и пробел являются новой строкой. XP1 13 лет назад 0
@ XP1: я предполагаю, что это Windows? BigChief 13 лет назад 0
@ BigChief, я работаю в Windows Vista, но я приму решения для операционных систем Windows или GNU / Linux. Несмотря на то, что я сказал, что предпочитаю решение без программирования, я приму программирование, если решение простое (например, одна строка или пара строк). XP1 13 лет назад 0
@ XP1: извините, вчера неправильно прочитал оригинальный вопрос. Siim K 13 лет назад 0

Похожие вопросы