Jika paragraf Anda selalu dipisahkan oleh satu baris kosong:
sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n | \
sed 's/^\x03//;1s/\x03$//;1!G;h;$!d;$a\' | tr $'\003' \\n
Ini cukup mudah untuk melihat cara kerjanya jika Anda memecahnya menjadi potongan-potongan dan menjalankan
sed '/^$/s/^/\x02/' infile
kemudian sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n
dan seterusnya ...
Jika paragraf Anda dipisahkan oleh satu atau lebih baris kosong, mis
Para 1 line 1
Para 1 line 2
Para 2 line 1
Para 3 line 1
Para 3 line 2
Para 4 line 1
Para 4 line 2
Para 5 line 1
dan Anda ingin membalik urutan paragraf tetapi mempertahankan urutan "blok kosong" Anda bisa membaca file dua kali:
1: mengubah paragraf menjadi baris tunggal (menghapus blok kosong di antara) dan membalikkannya dan
2: mengubah blok kosong menjadi satu baris, "mengindeks" jumlah baris kosong di setiap blok (dan menghapus garis tidak kosong)
kemudian paste
hasil dan proses output untuk mengembalikan baris baru:
paste -d $'\004' <(sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n | \
sed -e '/^\x03$/d;s/^\x03//;s/\x03$//;1!G;h;$!d;$a\') \
<(sed -E '/^$/!d;//{:a;N;/^(\n){1,}$/ba;s/\n/\x02/g;s/(.*)\x02.*/\1/}' infile) \
| sed '$!s/\x04/\n/;$s/\x04$//' | tr $'\003\002' \\n\\n
yang keluaran:
Para 5 line 1
Para 4 line 1
Para 4 line 2
Para 3 line 1
Para 3 line 2
Para 2 line 1
Para 1 line 1
Para 1 line 2
Jika Anda tidak keberatan dengan garis trailing tambahan di output, Anda bisa menghapus yang terakhir sed
:
paste -d $'\n' <(sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n | \
sed -e '/^\x03$/d;s/^\x03//;s/\x03$//;1!G;h;$!d;$a\') \
<(sed -E '/^$/!d;//{:a;N;/^(\n){1,}$/ba;s/\n/\x02/g;s/(.*)\x02.*/\1/}' infile) | \
tr $'\003\002' \\n\\n
Ini mengasumsikan bahwa baris pertama dan terakhir tidak kosong (dan tidak ada \x02
, \x03
atau \x04
dalam input).