Se i tuoi paragrafi sono sempre separati da un'unica riga vuota:
sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n | \
sed 's/^\x03//;1s/\x03$//;1!G;h;$!d;$a\' | tr $'\003' \\n
È abbastanza facile vedere come funziona se lo spezzi in pezzi e corri
sed '/^$/s/^/\x02/' infile
allora sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n
e così via ...
Se i tuoi paragrafi sono separati da una o più righe vuote, ad es
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
e vuoi invertire l'ordine dei paragrafi ma preservare l'ordine dei "blocchi vuoti" potresti leggere il file due volte:
1 °: trasforma i paragrafi in righe singole (rimuovendo i blocchi vuoti in mezzo) e invertili e
2 °: trasforma i blocchi vuoti in singole righe, "indicizzando" il numero di righe vuote in ciascun blocco (e rimuovendo le righe non vuote),
quindi paste
i risultati ed elaborare l'output per ripristinare le nuove righe:
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
che produce:
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
Se non ti dispiace una riga finale in più nell'output potresti eliminare l'ultima 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
Questi presuppongono che la prima e l'ultima riga non siano vuote (e no \x02
, \x03
o \x04
nell'input).