sed de partido1 a partido2
Frecuentes
Visto 823 veces
0
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
2 Respuestas
1
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
1
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 regex sed grep or haz tu propia pregunta.
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 :( - Leo92
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. - Birei
^ gracias, solo quería dejarlo más claro - Leo92