web-dev-qa-db-fra.com

Ajouter du texte autour des adresses électroniques dans plusieurs fichiers

J'ai plusieurs fichiers texte dans un dossier. Le texte en eux est dans ce format:

%%%%%%%%%%@yahoo.com
%%%%%%@wanadoo.fr
%%%%[email protected]
%%nameemail%%@yahoo.com
%[email protected]
%[email protected]
%1%[email protected]
%[email protected]
%[email protected]

Je veux apporter des modifications à tous les fichiers texte et les rendre comme suit:

{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%[email protected]"}
{"email":"%%nameemail%%@yahoo.com"}

Je veux faire les fichiers complets comme celui-ci qui sont dans un dossier.
J'ai essayé ceci:

awk '{ printf("{"email":"%s"}", $l);}' test

mais ça n'a pas marché.

Alors, est-il possible de modifier le texte de tous les fichiers d'un dossier comme celui-ci?

4
Jaffer Wilson
$ sed 's/.*/{"email":"&"}/' file
{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%[email protected]"}
{"email":"%%nameemail%%@yahoo.com"}
{"email":"%[email protected]"}
{"email":"%[email protected]"}
{"email":"%1%[email protected]"}
{"email":"%[email protected]"}
{"email":"%[email protected]"}

Donc, pour agir sur tous les fichiers que vous pourriez faire

sed -i 's/.*/{"email":"&"}/' *

Conserver une copie des anciens fichiers

sed -i.old 's/.*/{"email":"&"}/' *

Explication

  • -i.old modifie les fichiers en place au lieu de les imprimer sur stdout, et enregistre une copie de chaque fichier avant modification avec une extension .old
  • s/old/new remplace old par new
  • .* tous les caractères de la ligne
  • & le motif correspondant
6
Zanna

Sans doute plus verbeux, mais pour éditer tous les fichiers dans un répertoire:

  1. Si le répertoire est plat:

    #!/usr/bin/env python3
    import os
    import sys
    
    dr = sys.argv[1]
    
    for file in [os.path.join(dr, f) for f in os.listdir(dr)]:
        newtext = "\n".join(['{"email":"'+l.strip()+'"}'for l in open(file).readlines()])
        open(file, "wt").write(newtext)
    
  2. Si le répertoire est récursif et que vous devez également convertir les fichiers en sous-répertoires:

    #!/usr/bin/env python3
    import os
    import sys
    
    dr = sys.argv[1]
    
    for root, dirs, files in os.walk(dr):
        for file in files:
            file = os.path.join(root, file)
            newtext = "\n".join(['{"email":"'+l.strip()+'"}'for l in open(file).readlines()])
            open(file, "wt").write(newtext)
    

Dans les deux cas, le contenu du fichier devient:

{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%[email protected]"}
{"email":"%%nameemail%%@yahoo.com"}
{"email":"%[email protected]"}
{"email":"%[email protected]"}
{"email":"%1%[email protected]"}
{"email":"%[email protected]"}
{"email":"%[email protected]"}

Pour l'utiliser

  1. Copiez le script (l'un ou l'autre) dans un fichier vide, enregistrez-le sous le nom edit_files.py
  2. Exécutez-le avec le répertoire comme argument:

    python3 /path/to/edit_files.py /path/to/files_to_convert
    

Remarque

Cela suppose que toutes les lignes à l'intérieur tous les fichiers doivent être édités. Veuillez indiquer si nous devons définir une condition pour l'une ou l'autre ou les deux.

5
Jacob Vlijm

Avec awk, utilisez l’affectation de variable pour supprimer un niveau de citation:

awk -v format='{"email":"%s"}\n' '{printf format, $1}'
4
muru

Vous pouvez utiliser l'éditeur de flux sed pour cela:

sed -e 's/\(^.*\)$/{"email":"\1"}/g' source.txt
1
zx485

Manière Perl:

$ Perl -lane 'print "{\"email\":\"$_\"}"' input.txt                                                                      
{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%[email protected]"}
{"email":"%%nameemail%%@yahoo.com"}

Ceci peut être utilisé sur plusieurs fichiers dans un dossier de la manière suivante:

for file in * ; do Perl -lane 'print "{\"email\":\"$_\"}"' "$file" > "$file".json ; done

API Python et JSON:

$ ls
input2.txt  input.txt  json_encode.py*                                                                                                                
$ ./json_encode.py * 
$ ls
input2.txt  input2.txt.json  input.txt  input.txt.json  json_encode.py*  json_encode.py.json
$ cat input.txt.json
{"email": "%%%%%%%%%%@yahoo.com"}
{"email": "%%%%%%@wanadoo.fr"}
{"email": "%%%%[email protected]"}
{"email": "%%nameemail%%@yahoo.com"}

Et voici le script lui-même:

#!/usr/bin/env python
import json
import sys

for file in sys.argv[1:]:
     if __file__ in file or '.json' in file: continue
     with open(file,'r') as fd1:
         for line in fd1:
             data = { "email": line.strip() }
             with open(file+ ".json","a") as fd2:
                  json.dump(data,fd2)
                  fd2.write("\n")
1
Sergiy Kolodyazhnyy