sed de partido1 a partido2

Tengo un texto, que quiero imprimir lo que sea entre 2 palabras en ese texto que muestra solo la primera ocurrencia y deshabilita la codicia si existe, por ejemplo, digamos que tengo este texto

    word1 XXXX
TTTT
YYYY
ZZZZ
    GGGG word2 JJJJJJJ word2
    ads
    word2
    adasdas
    word1
    asadadsasd
    word2

lo que quiero es

    XXXX
TTTT
YYYY
ZZZZ
    GGGG

gracias

preguntado el 24 de agosto de 12 a las 19:08

Todavía soy novato, pero después de buscar en línea encontré esto sed -n -e "/palabra1/,/palabra2/p" y funciona, pero no sé cómo limitar el resultado solo a la primera aparición :( -

Edité la pregunta porque la fuente en negrita no está impresa dentro de las etiquetas de código y hace que la muestra de datos sea rara. -

^ gracias, solo quería dejarlo más claro -

2 Respuestas

Así que tengo un pequeño truco aquí. Pero funciona.

Archivo de prueba:

jfkakfakjskfj
    **word1** XXXX
TTTT
YYYY
ZZZZ
    GGGG **word2**
    ads
    **word2**
    adasdas
    **word1**
    asadadsasd
    **word2**

Salida:

    **word1** XXXX
TTTT
YYYY
ZZZZ
    GGGG **word2**

Comando sed:

sed -n '/word1/,$p' file | sed -n '1,/word2/p'

El primer comando sed coincide con todas las líneas de word1 todo el camino hasta el final del archivo y luego lo canalizamos en el segundo comando sed que coincide con todas las líneas desde el principio del archivo (que acabamos de canalizar) todo el camino hasta word2 está emparejado. Es complicado pero funciona.

Respondido 24 ago 12, 20:08

funcionó a las mil maravillas, de una manera muy inteligente :) gracias, solo una pequeña cosa, ¡es codicioso! por ejemplo, si hay 2 "palabra2" en la misma línea, tomará la última como ...palabra2 AAA palabra2, ¿hay alguna solución? - Leo92

@ Leo92 Desafortunadamente, no tengo una respuesta en este momento. Pero si encuentro uno, te lo haré saber. - florin stingaciu

ok gracias solo busco otra solucion sed "s/ /\n/g" | sed "0,/palabra1/d;/palabra2/,$d" , no puedo explicarlo, pero funciona, solo deja líneas vacías entre ellos :) - Leo92

@ Leo92 Tiene sentido. Básicamente, estás reemplazando cada espacio con un nuevo carácter de línea. Solo asegúrate de que esto es lo que quieres. Cada palabra estará ahora en su propia línea. si agregas sed 's/ /\n/g' file y canalizarlo a mi mando ocurrirá lo mismo. - florin stingaciu

sí, no me di cuenta porque mi entrada fue estúpida, dejó cada palabra en una nueva línea - Leo92

yo elegiría perl para el trabajo.

Asumiendo infile con el contenido de la pregunta y el siguiente contenido de script.pl:

#!/usr/bin/env perl
use warnings;
use strict;

die qq|Usage: perl $0 <input-file> <word-1> <word-2>\n| unless @ARGV == 3;

my ($word2, $word1) = (pop, pop);

while ( <> ) { 

    ## Remove last '\n'.
    chomp;

    ## Match range between first appearance of 'word1' and first appearance
    ## of 'word2'.
    if ( ( my $w1 = m/\Q$word1/ ) ... ( my $w2 = m/\Q$word2/ ) ) { 

        ## When 'word1' matched remove all characters but spaces until it.
        if ( $w1 ) { 
            s/\A(\s*).*?\Q$word1/$1/;
        }   

        ## When 'word2' matched remove all characters after it.
        if ( $w2 ) { 
            s/\A(.*?)\Q$word2\E.*$/$1/;
            printf qq|%s\n|, $_; 
            exit 0;
        }   

        ## Print lines inside the range.
        printf qq|%s\n|, $_; 
    }   
}

Ejecútelo como:

perl script.pl infile word1 word2

Con la siguiente salida:

     XXXX
TTTT
YYYY
ZZZZ
    GGGG

Respondido 24 ago 12, 20:08

muchas gracias por tu respuesta pero estoy usando windows :( , además no pensé que iba a ser tan complicado usar un script para hacer el trabajo - Leo92

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.