A fin de cuentas , engullir todo el archivo puede ser la forma más rápida de hacerlo.
La sintaxis básica es la siguiente:
sed -e '1h;2,$H;$!d;g' -e 's/__YOUR_REGEX_GOES_HERE__...'
Eso sí, engullir todo el archivo puede no ser una opción si el archivo es tremendamente grande. Para tales casos, otras respuestas proporcionadas aquí ofrecen soluciones personalizadas que están garantizadas para funcionar en una pequeña huella de memoria.
Para todas las demás situaciones de pirateo y corte, el simple hecho de anteponer -e '1h;2,$H;$!d;g'
seguido de su sed
argumento original de expresiones regulares prácticamente hace el trabajo.
p.ej
$ echo -e "Dog\nFox\nCat\nSnake\n" | sed -e '1h;2,$H;$!d;g' -re 's/([^\n]*)\n([^\n]*)\n/Quick \2\nLazy \1\n/g'
Quick Fox
Lazy Dog
Quick Snake
Lazy Cat
¿Qué -e '1h;2,$H;$!d;g'
hacer?
El 1
, 2,$
, $!
las partes son línea de especificadores de ese límite que líneas el comando directamente siguiente se ejecuta en.
1
: Solo en primera línea
2,$
: Todas las líneas a partir de la segunda
$!
: Cada línea que no sea la última
Ampliado, esto es lo que sucede en cada línea de una entrada de línea N.
1: h, d
2: H, d
3: H, d
.
.
N-2: H, d
N-1: H, d
N: H, g
El g
comando no tiene un especificador de línea, pero el d
comando anterior tiene una cláusula especial " Iniciar próximo ciclo ", y esto evita que se g
ejecute en todas las líneas, excepto en la última.
En cuanto al significado de cada comando:
- El primero
h
seguido de H
s en cada línea copia dichas líneas de entrada en sed
el espacio de espera . (Piense en un búfer de texto arbitrario).
- Luego,
d
descarta cada línea para evitar que estas líneas se escriban en la salida. El espacio de la bodega sin embargo se conserva.
- Finalmente, en la última línea,
g
restaura la acumulación de cada línea desde el espacio de espera para que sed
pueda ejecutar su expresión regular en toda la entrada (en lugar de una línea a la vez), y por lo tanto es capaz de partido en \n
s.