• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

221
Vistas
¿Cómo usar SED para eliminar textos desde el primer patrón hasta la segunda aparición del patrón final?

Estoy tratando de usar sed para eliminar textos desde la línea con el primer patrón hasta la línea con la segunda aparición del patrón final.

Por ejemplo, el primer patrón es BEGIN y el patrón final es BREAKPOINT .

Ejemplo de entrada:

 qq ww BEGIN ab ef BREAKPOINT ij mn BREAKPOINT kk BREAKPOINT zz yy xx BEGIN ab ef BREAKPOINT ij mn BREAKPOINT pp

Rendimiento esperado:

 qq ww kk BREAKPOINT zz yy xx pp

¿Podría por favor decirme cómo, o tal vez una forma alternativa de lograr esto?

PD. Solo sé cómo mostrar textos entre el primer patrón hasta la segunda aparición del patrón final, pero no sé cómo eliminarlos.

 sed -n '/BEGIN/{:a;N;s/BREAKPOINT/&/2p;Ta}' file

Gracias.

about 3 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Es casi seguro que no es imposible hacer esto en sed , pero también es casi seguro que en algún lugar entre difícil e imposible entender la solución dentro de algunas semanas a menos que esté extremadamente familiarizado con sed . Mejor entonces cambiar a un lenguaje de secuencias de comandos más legible por humanos:

 awk '/^BEGIN$/ && !s { s=2 } !s /^BREAKPOINT$/ && s { s-- }' file

En resumen, la variable s realiza un seguimiento de si hemos visto el separador inicial y, de ser así, cuántas veces queremos ver el separador final antes de volver a imprimir las líneas de entrada.

about 3 years ago · Santiago Trujillo Denunciar

0

Solo con las muestras mostradas, intente seguir el código awk , escrito y probado en GNU awk .

 awk ' /^BEGIN/,/^BREAKPOINT/{ flag=1 next } flag && /BREAKPOINT/{ flag="" next } !flag ' Input_file

Explicación: agregando una explicación detallada de lo anterior.

 awk ' ##Starting awk program from here. /^BEGIN/,/^BREAKPOINT/{ ##Checking range from line starts from BEGIN till line starts BREAKPOINT then do following. flag=1 ##Setting flag to 1 here. next ##next will skip all further statements from here. } flag && /BREAKPOINT/{ ##Checking condition if flag is SET and BREAKPOINT is found then do following. flag="" ##Nullifying flag here. next ##next will skip all further statements from here. } !flag ##Checking condition if flag is NULL then print current line. ' Input_file ##Mentioning Input_file name here.
about 3 years ago · Santiago Trujillo Denunciar

0

Una perla:

 perl -0777 -pe 's/^BEGIN[\s\S]*?^BREAKPOINT[\s\S]*?^BREAKPOINT\R//gm' file

O,

 perl -0777 -pe 's/^BEGIN(?:[\s\S]*?^BREAKPOINT\R){2}//gm' file
about 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda