Si usted está buscando una solución rápida en la línea de comandos usando Perl, este es un caso ideal para el operador flip-flop
. Ahora, hay dos maneras, que esta pregunta se puede interpretar de casos extremos - ambos funcionarán de la misma, siempre y cuando pattern1
viene antes pattern2
:
Si pattern1 viene después patrón2 pero antes Pattern3 borrar todo en el medio pattern1 y Pattern3
o, si pa ttern1 viene después patrón2 pero antes Pattern3 no hacen nada menos que ves otra pattern1.
Antes de empezar, tome nota del argumento del Perl -p
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
Ahora, para el primero, te doy ..
perl -pe'$x ||= /7/; $_= "" if /5/ .. /8/ and $x' <(seq 1 10)
1
2
3
4
5
6
9
10
$x ||= /7/
: Esto establece $x
a la valor de /7/
regresar cuando $x
es false
. /7/
devolverá true
cuando coincida. Esto significa $x
consigue el sistema de verdad, en el primer partido y la naturaleza de ||=
es no volver a poner la variable cuando ya es cierto.
A continuación, establece $_ = ''
si el rango es entre /5/
y /8/
y ya se ha puesto a $x
cierto. Recordar el camino de cortocircuito obras: a && b
medios corren b
sólo si a
evalúa a true
.En este caso, el mero hecho de evaluar a
establecerá el estado del operador de flip-flop; eso es lo que queremos; sin embargo, solo queremos que ocurra $_ = ''
si ya se ha visto 7
.
Ahora, a la segunda interpretación de la quesiton acaba de cambiar el orden ...
perl -pe'$x ||= /7/; $_= "" if $x and /5/ .. /8/' <(seq 1 10)
Esto imprimirá toda la gama. Perl no comenzará a buscar /5/
hasta que encuentre /7/
. En nuestro rango secuencial eso no sucederá.
Por cierto, realmente poner algunas de estas respuestas a la vergüenza, muchos de los espacios no son necesarios ...
perl -pe'$x||=/2/;$_=""if$x&&/5/../8/' # secksey
Si ** ** pattern1 se produce después de ** ** patrón2 debe producirse la eliminación? –