Est-ce que quelqu'un me guidera pour ne grep que les mots contenant le motif _ARA de la chaîne unique ci-dessous.
Chaîne:
LINK:['IM219MIR_ARA1','IM18Q4_ARA1','SM18Q4_ARA1','IM18PLANNING_ARA1','IM118Q4DYNVA_ARA1','IM218Q4DYNVA_ARA1','IM119EIOPALTG_ARA1','IM219EIOPALTG_ARA1','SM119EIOPALTG_ARA1']}
Production attendue:
IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
grep
accepte -o
pour imprimer uniquement le texte correspondant, sur des lignes distinctes même si les correspondances proviennent de la même ligne. Il accepte également -w
pour forcer l'expression régulière à correspondre à un mot entier (ou à ne pas correspondre du tout), où un mot est une séquence maximale de lettres, de chiffres et de traits de soulignement. Vous pouvez donc simplement utiliser:
grep -ow '\w*_ARA\w*'
Dans ce cas, vous pouvez réellement omettre le -w
option si vous le souhaitez, et obtenez le même résultat, car l'expression régulière ici ne correspond explicitement qu'aux caractères Word avec \w
.
Cela lira à partir de l'entrée standard car il n'y a aucun argument de nom de fichier. Si le texte que vous avez montré se trouve dans un fichier - disons, appelé input.txt
-- alors vous passeriez cela comme argument:
grep -ow '\w*_ARA\w*' input.txt
Cela produit:
IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
Techniquement, la sortie que cela produit est légèrement différente de celle que vous avez montrée dans votre question, car la sortie attendue que vous avez montrée répertorie IM119EIOPALTG_ARA1
deux fois, même s'il n'apparaît qu'une seule fois dans le texte que vous avez affiché. Je suppose que c'est une erreur et vous ne le voulez qu'une seule fois.
Si vous souhaitez utiliser les commandes cut
et sed
, utilisez ceci:
<test.txt cut -d'[' -f2 | cut -d']' -f1 | sed "s/,'/\\n/g" | sed 's/.$//' | cut -d\' -f2 | grep _ARA
Explication en 2 parties:
grep _ARA
trouverait des lignes qui doivent être filtréescut -d'[' -f2
supprimera les caractères avant vos mots, de même pour cut -d']' -f1
ce qui supprimerait ce qui est aprèssed "s/,'/\\n/g"
extraira chaque mot en une seule ligne<test.txt
n'est qu'une redirection pour les commandes cut
et grep
Après ces 4 commandes précédentes, le résultat est:
'IM219MIR_ARA1'
IM18Q4_ARA1'
SM18Q4_ARA1'
IM18PLANNING_ARA1'
IM118Q4DYNVA_ARA1'
IM218Q4DYNVA_ARA1'
IM119EIOPALTG_ARA1'
IM219EIOPALTG_ARA1'
SM119EIOPALTG_ARA1'
Donc, pour supprimer le '
à la fin de chaque mot, nous ajoutons
sed 's/.$//'
et pour la 1ère '
, nous utilisons
cut -d\' -f2
Le résultat final est donc:
IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
Si vous voulez plus de détails sur cette commande, vous pouvez lire ma discussion avec Eliah Kagan .