2016-05-05 7 views
3

Comment imprimer la sortie de grep -o en une seule ligne? Je suis en train d'imprimer:impression de la sortie "grep -o" en ligne simple

$ echo "Hello Guys!" |grep -E '[A-Z]' 
Hello Guys! 
$ echo "Hello Guys!" |grep -Eo '[A-Z]' <----Multiple lines 
H 
G 
$ echo "Hello Guys!" |grep -Eo '[A-Z]' 

sortie souhaitée:

HG 

Je suis en mesure de réaliser à moindre coût à l'aide de commande suivante, mais le problème est que nombre de lettres (3 dans ce cas) pourrait être dynamique. Donc cette approche ne peut pas être utilisée.

echo "HEllo Guys!" |grep -oE '[A-Z]' |xargs -L3 |sed 's/ //g' 
HEG 
+0

Ceci est par définition ce que '-o' fait --->' Imprimer uniquement les parties correspondantes (non vides) d'une ligne correspondante, avec chacune de ces parties sur une ligne de sortie séparée'. – fedorqui

+2

Pourrait utiliser sed. 'echo" Bonjour les gars! " | sed 's/[^ A-Z] // g'' – 123

+0

@ 123, merci. Votre solution a fonctionné pour moi. – monk

Répondre

3

Vous pouvez tout faire avec ce sed instruction

echo "Hello Guys!" |sed 's/[^A-Z]//g' 

MISE À JOUR

Répartition de commande sed:

Le s /// est sed commande de substitution. Il remplace simplement le premier RegEx (celui entre la première et la seconde barre oblique) avec l'expression entre les barres obliques deux et trois. La fin g est synonyme de global, c'est-à-dire, pour chaque correspondance du RegEx dans la ligne courante. Sans le g, il ne s'arrêterait pas après le premier match. Le RegEx lui-même correspond à n'importe quelle lettre non majuscule et ensuite ces lettres sont remplacées par rien, c'est-à-dire effacées efficacement.

+0

J'allais publier ce message, mais il est limité en ce que vous ne pouvez l'utiliser correspondre à des caractères individuels, il deviendrait beaucoup plus compliqué pour les mots. – 123

+0

@ 123 Honnêtement, je n'ai pas vu votre commentaire quand je l'ai posté, ne voulait pas voler votre idée. Quoi qu'il en soit, l'OP n'a pas déclaré qu'il voulait faire correspondre des mots entiers. Seulement que le nombre de majuscules peut varier. – nautical

+0

Salut Nautique, Pouvez-vous s'il vous plaît décomposer commande sed pour la compréhension? S'il vous plaît . – monk

3

Vous pouvez utiliser awk:

echo "Hello Guys!" | awk '{ gsub(/[^A-Z]/,"", $0); print;}' 
HG 

également avec tr:

echo "Hello Guys!" | tr -cd [:upper:] 
HG 

également avec sed:

echo "Hello Guys!" | sed 's/[^\[:upper:]]//g' 
HG 
+2

Cela laissera également l'invite sur la même ligne. – 123

+0

Je ne reçois pas votre commentaire – Troncador

+2

Il ne laisse pas de retour à la ligne de début, donc l'invite commencera juste après la chaîne. – 123

1

Vous pouvez utiliser perl au lieu de grep

echo 'HEllo Guys!' | perl -lne 'print /([A-Z])/g' 
HEG 
2

Vous avez juste besoin de supprimer les caractères de nouvelle ligne. Vous pouvez utiliser tr pour que:

echo "HEllo Guys!" |grep -Eo '[A-Z]' |tr -d '\n' 
HEG 

Cependant, il coupe le dernier saut de ligne aussi.

+0

HEG arrive avant l'invite de commande. – monk

+0

@monk Ceci est dû au fait que le dernier caractère de nouvelle ligne est également coupé, c'est-à-dire qu'il n'y a pas de nouvelle ligne entre la sortie et l'invite de commande suivante. – Jahid