grep pour les mots en majuscules

J'ai un file qui contient des déclarations avec des mots majuscules, quelque chose comme:

public final Foo BAR; 

ces déclarations ne sont pas toutes uniforms. Y a-t-il un moyen pour moi de récupérer uniquement les mots en majuscules de la ligne? Je sais find des lignes qui contiennent des majuscules, mais ce n'est pas ce que je veux. Je ne veux que le mot correspondant en majuscule. Merci!

En fait, avec le commutateur -o , GNU grep ne renvoie que ce qu'il a apparié. Que diriez-vous:

 grep -oP "\w*[AZ]+\w*" yourfile.txt 

Notez que cette regex correspondra à des mots avec des majuscules n'importe où , mais pas nécessairement le début. Vous devriez l'adapter pour répondre à vos besoins si elles diffèrent.

Comme indiqué ci-dessous, cela pourrait ne pas être la solution la plus portable. Une alternative portable en Perl est

 perl -nE 'say $1 while /(\w*[AZ]+\w*)/g' yourfile.txt 

La norme d'expression régulière de base POSIX (utilisée par défaut dans grep , vim , less , sed , etc.) utilise \< et \> pour signifier les limites des mots. Cela permet à une lettre de suivre les espaces blancs, ainsi que des caractères non alphanumériques comme des guillemets, des tirets, des signes d'égalité, etc. Utilisez l'option -o pour imprimer chaque correspondance sur une nouvelle ligne, et voilà:

 grep -o '\<[AZ][az]*\>' yourfile.txt 

Encore une fois, vous devrez peut-être changer l'expression rationnelle pour répondre à vos besoins. Peut-être en permettant des numbers ou une deuxième lettre majuscule ..? Cela fait les deux ..

 grep -o '\<[AZ][a-z0-9]*[AZ][a-z0-9]*\>' yourfile.txt 

vous pourriez utiliser sed pour ne renvoyer que la string et non toute la ligne

 sed 's/.*\([AZ]*\).*/\1/g' <file> 

ou

 sed 's/[az]*\| //g' <file>