Si sus párrafos siempre están separados por una sola línea vacía:
sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n | \
sed 's/^\x03//;1s/\x03$//;1!G;h;$!d;$a\' | tr $'\003' \\n
Es bastante fácil ver cómo funciona si se rompe en pedazos y ejecutar
sed '/^$/s/^/\x02/' infile
a continuación, sed '/^$/s/^/\x02/' infile | tr \\n$'\002' $'\003'\\n
y así sucesivamente ...
Si sus párrafos están separados por una o más líneas vacías, p. Ej.
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
y desea revertir el orden de los párrafos pero preservar el orden de "bloques vacíos", puede leer el archivo dos veces:
primero: convierta los párrafos en líneas simples (eliminando los bloques vacíos intermedios) e inviértalos y
segundo: gire los bloques vacíos en líneas individuales, "indexando" el número de líneas vacías en cada bloque (y eliminando las líneas no vacías),
luego paste
los resultados y procesan la salida para restaurar nuevas líneas:
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
que salidas:
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
Si no le importa una línea final adicional en la salida, puede soltar la última 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
Estos suponen que la primera y la última línea no están vacías (y no \x02
, \x03
o \x04
en la entrada).