El espacio de patrón y de retención, muy difícil de comprender sin explicarlo muy bien
sed@command:~$ cat lineas.txt
una
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
diez
sed@command:~$
sed@command:~$ cat lineas2.txt (tiene un espacio al final de la última línea)
una
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
diez
sed@command:~$
sed@command:~$ cat lineas.txt | sed '/./{H;d};x;' (como la condición /./ siempre se cumple nunca llega a ejecutar x y por eso no imprime nada
sed@command:~$
sed@command:~$ cat lineas2.txt | sed '/./{H;d};x;' (como el archivo al final contiene una línea en blanco /./ deja de cumplirse, pasa a la instrucción x y por eso imprime)
una
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
diez
sed@command:~$
El comando podría leerse algo así, if /./ { do{H;d}while(no linea en blanco);x }
Mientras la línea contiene algo ejecuta {H;d} (añade la línea del espacio de patron al de retención y la borra del espacio de patrón), y cuando no (la línea ultima en blanco) ejecuta x (intercambia las líneas almacenadas en el espacio de retención a patrón) y por eso las imprime todas
Etiquetas condicionales
si la línea coincide con el patron cuatro salta a la etiqueta z y sólo sustituye u por chu, sino sustituye u por mu y luego u por chu
sed@command:~$ sed '/cuatro/bz;s/u/mu/;:z;s/u/chu/' lineas.txt
mchuna
dos
tres
cchuatro
cinco
seis
siete
ocho
nmchueve
diez
sed@command:~$
Condicionales fáciles
-nE (imprime sólo lo que coincide y habilita el uso de expresiones regulares sin tener que escapar los caracteres con \)
sed@command:~$ sed -nE '/^.{4}$/p' lineas.txt (líneas que sólo tengan 4 caracteres)
tres
seis
ocho
diez
sed@command:~$ sed -nE '/^.{4}$/{n;p}' lineas.txt (n salta a la siguiente línea y p imprime)
cuatro
siete
nueve
once once
sed@command:~$ sed -nE '/^.{4}$/{n;n;p}' lineas.txt (salta 2 líneas e imprime)
cinco
ocho
sed@command:~$