Manipulation d’un chemin dans une adresse email

J’ai un fichier avec les contenus suivants:

./E/domainname.com/martin ./s/domain2.com/shelly ./E/2/4domain.com/john ./X/another.net/gary 

Je veux sortir:

 [email protected] [email protected] 

et ainsi de suite.

J’ai essayé d’isoler d’abord les noms des utilisateurs en recherchant en arrière dans les lignes jusqu’à ce que je frappe un / , mais j’ai échoué jusqu’à présent.

J’utiliserais awk:

 awk -F/ '{printf "%s@%s\n",$NF,$(NF-1)}' input.file 

-F/ marque le / comme le délimiteur de champ. En utilisant $1 , $3 , … vous pouvez accéder aux champs. $0 représente l’enregistrement complet. NF représente le nombre de champs dans une ligne. Sachant cela, vous pouvez utiliser $NF pour sélectionner le dernier champ d’une ligne et $(NF-1) pour sélectionner le second dernier champ et les imprimer en utilisant un délimiteur @ .

Vous pouvez essayer la commande sed ci-dessous.

 $ sed 's~.*/\([^/]*\)/\([^/]*\)$~\2@\1~g' file [email protected] [email protected] [email protected] [email protected] 

Explication:

  • .*/ Fait correspondre tous les caractères depuis le début jusqu’au symbole / (deuxième symbole de barre oblique à partir du dernier).
  • \(...\) Appelé groupe de capture, qui était utilisé pour capturer des caractères.
  • [^/]* Correspond à n’importe quel caractère mais pas à / zéro ou plusieurs fois. Donc, le combiné \([^/]*\) capturerait tous les caractères existant avant le dernier symbole / .
  • / Correspond à la dernière barre oblique.
  • \([^/]*\) Capture tous les caractères, mais pas / zero ou plusieurs fois dans un autre groupe.
  • $ Indique la fin de la ligne.
  • Dans la pièce de remplacement, le référencement du groupe capturé tel que \1 , \2 imprimera les caractères à l’intérieur du groupe correspondant.

Avec bash builtins (extension de paramètre):

 #!/bin/bash while read LINE; do NAME="${LINE##*/}" DOMAIN="${LINE%*/$NAME}" DOMAIN="${DOMAIN##*/}" echo "$NAME@$DOMAIN" done < filename 

Sortie:

 [email protected] [email protected] [email protected] [email protected] 

Une alternative avec sed:

 sed -E 's|^.*/(.*)/([^ ]*)|\2@\1|' filename