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. \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