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 sedargumento 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 gcomando no tiene un especificador de línea, pero el dcomando anterior tiene una cláusula especial " Iniciar próximo ciclo ", y esto evita que se gejecute en todas las líneas, excepto en la última.
En cuanto al significado de cada comando:
- El primero
hseguido de Hs en cada línea copia dichas líneas de entrada en sedel espacio de espera . (Piense en un búfer de texto arbitrario).
- Luego,
ddescarta 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,
grestaura la acumulación de cada línea desde el espacio de espera para que sedpueda 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 \ns.