web-dev-qa-db-fra.com

Comment grep des mots à partir d'une seule chaîne correspondant à un modèle?

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
6
ptmjyothish

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.

9
Eliah Kagan

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ées
  • cut -d'[' -f2 supprimera les caractères avant vos mots, de même pour cut -d']' -f1 ce qui supprimerait ce qui est après
  • sed "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 .

4
damadam