Con sed
:
sed '$!N;/remove/!P;D' infile
Esto tira de la N
línea ext al espacio del patrón (si no está !
en la $
línea t) y verifica si el espacio del patrón coincide remove
. Si no lo hace (significa que ninguna de las dos líneas en el espacio del patrón contiene la cadena remove
), se P
alinea con el primer \n
carácter de línea ew (es decir, imprime la primera línea). Luego D
elige hasta el primer \n
carácter ewline y reinicia el ciclo. De esta manera, nunca hay más de dos líneas en el espacio del patrón.
Es probable que sea más fácil de entender el N
, P
, D
ciclo si se agrega l
antes y después de la N
que mirar el espacio de patrones:
sed 'l;$!N;l;/remove/!P;D' infile
entonces, usando solo las últimas seis líneas de su ejemplo:
8AC3
remove
8AE4
8AE5
8AE6
remove
el último comando sale:
8AC3 $
8AC3 \ n eliminar $
eliminar $
eliminar \ n 8AE4 $
8AE4 $
8AE4 \ n 8AE5 $
8AE4
8AE5 $
8AE5 \ n 8AE6 $
8AE5
8AE6 $
8AE6 \ n eliminar $
eliminar $
eliminar $
Aquí hay una breve explicación:
cmd salida cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)