Rendre un .vcf "easy to read" via script Bash

Bonjour,

Petit exercice personnel: J’ai un .vcf qui contient tout mes anciens contacts (nom, téléphone et e-mail pour certains). Ce que j’aimerai c’est pouvoir importer les informations importantes instantanemment via un script dans une forme plus sympatique que la tronche du .vcf:

La forme que je désire pourrait être:

Je pense que j’ai plusieurs outils dont j’ai besoin: grep (trouver les occurences), awk, cut (enlever les “FN”, “N”, “TEL” et “EMAIL”) etc.

Ce qui m’intéresse ce n’est pas que vous me donniez du code (pas de suite du moins) mais des pistes sur la manière dont le problème doit être traité.

Pour moi ça se passerai comme ça:

Le script commence par chercher l’occurrence “BEGIN” (qui marque le début d’un contact) et vérifie que les occurrences suivantes sont présentes: FN, TEL, EMAIL.
Pour chaque occurrence présente il va prendre la ligne et découper (cut?) la partie intéressante (après “:”) et continue jusqu’à ce qu’il tombe sur “END”, une fois tombé dessus j’envoie par exemple un petit echo avec une ligne vide et un retour à la ligne pour faire une démarcation entre deux contacts.

Qu’en pensez-vous? Vous avez plus simple?

Pour le moment je pourrai facilement afficher via grep les lignes qui m’intéressent:

Seulement mon problème c’est de faire en sorte que chaque occurence aille au bon endroit (le bon contact), et c’est avec le marquage avec BEGIN et END qui doit m’aider je suppose. Mais je ne vois pas comment faire.

Une idée?

Koshicalement, koshie

Dans ce topic j’ai pu apercevoir une ligne intéressante que j’ai adapté:

ce qui donne:

Et dans le contexte la personne voulait afficher “X” lignes après le début de l’occurrence, moi je voudrais qu’il affiche TOUTES les occurrences mais en les regroupant par celle qui sont dans la même vcard (entre BEGIN et END).

Je me suis rendu compte que grep est peut-être “trop faible” pour ce que je lui demande, par contre egrep lui:

Me donne un retour intéressant:

Toutes les lignes avec le mot spécifié sont affichés et dans le bon ordre. Maintenant pour obtenir un résultat correct il faut:

_ Que je remplace les occurrences par (respectivement): Contact, Téléphone et E-mail.
_ Qu’il y est une ligne de séparation entre chaque vcard, le soucis étant que si je désire faire un saut à la ligne après chaque “E-mail” (dont les occurrences sont très faibles) je n’aurai pas tout mes contacts avec cette séparation. Si je le fais après “Téléphone” je vais sauter une petite partie de mes contacts (et c’est moche).
Idem, si je fais un saut à la ligne avant Contact j’aurai en début de fichier une ligne vide, que je pourrai corriger en une autre commande mais c’est se prendre la tête pour faire un truc pas très élégant au final, je pense. Autant se prendre la tête à faire un truc bien, non?

Avez-vous une idée? Je continue mes recherches.

À vu de nez tu peut tout faire avec awk assez facilement. C’est un langage de script à part entière. Tu peut l’utiliser ainsi :

#!/usr/bin/awk -f /plouf/ { print "bidule" }

Voici un exemple simpliste :

[code]#!/usr/bin/awk -f

BEGIN {
FS=";|:“
OFS=” : "
}

$1 == “FN” {
print “nom”, $NF
}

$1 == “EMAIL” {
print “e-mail”, $NF
}

$1 == “TEL” {
print “téléphone”, $NF
}[/code]
Je ne connais pas la signification de chaque champ. Tu peut dans chaque close y mettre la logique que tu souhaite pour sortir le code postale et l’adresse etc.

Merci pour ton code !

J’ai crée un fichier .awk avec le contenu que tu m’as donné, je l’exécute mais j’ai une erreur:

[quote]koshie@OnyxU:~$ bash scripts/awk/easy-to-read-vcf.awk 00001.vcf
scripts/awk/easy-to-read-vcf.awk: ligne 3: BEGIN : commande introuvable
scripts/awk/easy-to-read-vcf.awk: ligne 6: Erreur de syntaxe près du symbole inattendu « } »
scripts/awk/easy-to-read-vcf.awk: ligne 6: `}’[/quote]

(J’ai cru comprendre qu’il se lancait via bash/sh et non pas avec la commande awk qui me renvoit l’erreur:

[quote]awk: ligne de commande :1: scripts/awk/easy-to-read-vcf.awk
awk: ligne de commande :1: ^ syntax error
[/quote]

Une idée?

J’ai trouvé la solution, en fait il fallait taper:

Je n’ai pas de saut à la ligne par contre.

Plus simple, tu le rend exécutable et tu le lance comme ça :

Salut
Confronté au même besoin ça marche bien.

debian:~/Documents$ cat read-vc.awk
#!/usr/bin/awk -f
BEGIN {
   FS=";|:"
   OFS=" : "
}
$1 == "FN" {
   print "nom", $NF
}
$1 == "EMAIL" {
   print "e-mail", $NF
}
$1 == "TEL" {
   print "téléphone", $NF
}

@debian:~/Documents$ sudo chmod 755 read-vc.awk

Et hop

@debian:~/Documents$ ./read-vc.awk 00001.vcf > 00001.txt

Puis j’ai ouvert le fichier 00001.txt avec libreoffice calc en disant que le séparateur est le : dans autre et en décochant tous les autres

Merci les gars :grinning: