Boş satırsonları / satır sonları ile ayrılan çok satırlı metin bölümlerinin sırası nasıl tersine çevrilir?


2

Boş satırsonları / satır sonları ile ayrılmış çok satırlı metin bölümlerinin sırası nasıl tersine çevrilir ...

... basit bir komut veya uygulama ile, tercihen programlama olmadan?

Bir sıralama istemiyorum, ancak yalnızca metin bölümlerinin tersi sırasını istiyorum.

Örneğin:

A
B

0
1

X
YX
Y

HTTP
FTP

olur

HTTP
FTP

X
YX
Y

0
1

A
B

Üzgünüm, henüz bir cevap almadım. Bir süredir uzaktayım. Peth'in çözümünü kabul ettim çünkü en basit olanı. Tüm çalışma çözümlerini geliştirdim. Herkese teşekkürler.
XP1

Yanıtlar:


3

tacbir ayırıcıyı kabul eder, örneğin bash:

tac -s $'\n\n' foo

Son paragrafın çift satırsonu ile sonlandırılmadığından, hatalı çıktı üretecek. Yani,

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

Muhtemelen istediğin şey budur. (Boru içeriği foove satır boyunca tac, sonra da sedson satır şerit).

Not:> foo Boş bir dosyayla sonuçlanabileceğinden, bunu tekrar yönlendirmeyin .


+1. İşe yarıyor. Gelecekte başvurmak için "foo" dosya adıdır. Dosyaya vermek için, şu komutu kullanarak yeni bir dosyaya yönlendirdim: "(cat foo; echo) | tac-s $ '\ n \ n' | sed '$ d'> foo1.txt".
XP1

2

Yazar programlama çözümlerini tercih etmese de, Python kullanmak 1 satırda oldukça kolay olurdu:

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

Açıkçası yerine input.txtve output.txtistenilen dosyaları ile ve değiştirmek \niçin \r\n, Windows biçimli metin dosyaları için.

Bunu bir .pydosyaya koy ve ara python myscript.py.


+1, tek astarı beğendim. Python gerçekten bazı harika şeyler sağlar
Siim K

1

Windows kullanıyorsanız, Powershell'i kullanabilirsiniz. Bu, içeriğini tersine çevirir test.txtve sonucu test2.txt:

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

Güncelleme:

Bu hile yapmak gerekir (tüm satırları okur test.txtve test2.txtistediğiniz şekilde dosyalamak için onları yeniden düzenler ):

$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

Muhtemelen en şık yol değil ama işini test çantanda yaptı.


Ne yazık ki, komut aynı zamanda metin bölümlerindeki tek tek satırların sırasını da değiştiriyor, bu istediğim şey değil. Örneğin, "A, B" sırası, virgül ve boşluğun yeni bir satır olduğu "B, A" olur.
XP1

@ XP1: Sanırım bu yüzden bu Windows?
Şef

@BigChief, Windows Vista'dayım, ancak Windows veya GNU / Linux tabanlı işletim sistemleri için çözümler kabul edeceğim. Programlama olmadan bir çözümü tercih ettiğimi söylesem de, çözüm basit olduğu sürece programlamayı kabul edeceğim (örneğin bir astar veya çift satır).
XP1

@ XP1: üzgünüm, dün orjinal soruyu yanlış okudum.
Siim K
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.