2011-02-14 11 views
7

Me pregunto cómo puedo hacer lo siguiente con sed: Necesito mantener solo las primeras tres palabras en cada línea. Por ejemplo, el siguiente texto:script sed para imprimir las primeras tres palabras en cada línea

the quick brown fox jumps over the lazy bear 
the blue lion is hungry 

se transformará en:

the quick brown 
the blue lion 
+1

Nota: cuando he añadido el pregunta, me olvidé de "cortar", que es la herramienta adecuada para hacer el trabajo: cu t -f-3 -d "" – BearCode

Respuesta

13

Usted puede utilizar cut así:

cut -d' ' -f1-3 
+0

gracias. De hecho, debería haberme dado cuenta de que es una tarea para "cortar", no para "sed". corte -f -3 archivo de entrada. – BearCode

+2

Nota '-f-3' es equivalente a' -f1-3'.Eso es '-3' significará: todos los campos hasta' 3'. – fedorqui

+1

No lo sabía, gracias. ¡Sospecho que continuaré escribiendo '-f1-3' aunque para mayor claridad y porque me olvidaré de la abreviatura! –

16

en AWK se puede decir:

{print $1, $2, $3} 
+0

gracias brillantes estaba buscando algo para quitar la primera palabra de un comando de ejecución de instancias ec2, estaba jugando con sed y corte pero awk es perfecto para mis requisitos –

+1

gracias por esto pero es un poco confuso, entonces habría agregado 'awk -vORS = '' '{print $ 1}'' (donde uso '-vORS = ''' ya que quiero que las palabras se separen. – Sverre

+0

Jugar al golf: 'awk '{NF = 3} 1'' –

5

Yo sugeriría awk en esta situación:

awk '{print $1,$2,$3}' ./infile 
1

Si necesita una secuencia de comandos sed, puede intentar:

echo "the quick brown fox jumps over the lazy bear" | sed 's/^\([a-zA-Z]\+\ [a-zA-Z]\+\ [a-zA-Z]\+\).*/\1/' 

Pero creo que sería más fácil el uso de corte:

echo "the quick brown fox jumps over the lazy bear" | cut -d' ' -f1,2,3 
+0

El corte no hace frente a las variaciones en los espacios en blanco utilizados. – cbz

+0

Tampoco incluye un espacio literal en el comando 'sed' (que no necesita ser escapado, por cierto). –

1

Aquí está una fea con sed:

$ echo the quick brown fox jumps over the lazy bear | sed 's|^\(\([^[:space:]]\+[[:space:]]\+\)\{2\}[^[:space:]]\+\).*|\1|' 
the quick brown 
2

Solo con el shell

while read -r a b c d 
do 
    echo $a $b $c 
done < file 

Rubí (1,9) +

ruby -ane 'print "#{$F[0]} #{$F[1]} #{$F[2]}\n"' file 
+0

''puts $ F [0..2] .join" "'' es algo más conciso para el ruby. –

5
% (echo "A B C D E F G H";echo "a b c d e f g h") | sed -E 's/([^\s].){3}//' 

puse el "-E" allí para la compatibilidad OS X. Otros sistemas Unix pueden o no necesitarlo.

editar: damnitall - brainfart. utilizar esto:

% sed -E 's/(([^ ]+){3}).*/\1/' <<END 
the quick brown fox jumps over the lazy bear 
the blue lion is hungry 
END 

the quick brown 
the blue lion 
+0

+1 para obtener una solución más concisa con 'sed', aunque es posible que desee editar su publicación para eliminar su primer intento. – thkala

0

Si Perl es una opción:

perl -lane 'print "$F[0] $F[1] $F[2]"' file
o
perl -lane 'print join " ", @F[0..2]' file

Cuestiones relacionadas