Adicione algum texto em torno dos endereços de e-mail em vários arquivos

4

Eu tenho vários arquivos de texto em uma pasta. O texto neles está neste formato:

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

Eu quero fazer alterações em todos os textos dos arquivos e torná-los semelhantes aos seguintes:

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

Eu quero fazer os arquivos completos como este que estão em uma pasta.
Eu tentei isso:

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

mas não funcionou.

Então, existe alguma maneira de modificar o texto em todos os arquivos em uma pasta como essa?

    
por Jaffer Wilson 24.01.2017 / 11:39

5 respostas

6
$ 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]"}

Então, para atuar em todos os arquivos que você poderia fazer

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

Para manter uma cópia dos arquivos antigos

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

Explicação

  • -i.old modificar arquivos no lugar em vez de imprimir para stdout e salvar uma cópia de cada arquivo antes da modificação com uma extensão .old
  • s/old/new replace old com new
  • .* quaisquer caracteres na linha
  • & o padrão correspondente
por Zanna 24.01.2017 / 11:45
5

Sem dúvida, mais detalhado, mas para editar todos os arquivos dentro de um diretório:

  1. Se o diretório for plano:

    #!/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. Se o diretório for recursivo, você também precisará converter arquivos em subdiretórios:

    #!/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)
    

Em ambos os casos, o conteúdo do arquivo é alterado para:

{"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]"}

Para usá-lo

  1. Copie o script (um deles) em um arquivo vazio, salve-o como edit_files.py
  2. Execute-o com o diretório como argumento:

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

Nota

Isto assume todas as linhas dentro de todos os arquivos que precisam ser editados. Por favor, mencione se precisamos definir uma condição para um ou ambos.

    
por Jacob Vlijm 24.01.2017 / 12:22
4

Com awk , use a atribuição de variável para remover um nível de cotação:

awk -v format='{"email":"%s"}\n' '{printf format, $1}'
    
por muru 24.01.2017 / 11:45
1

Você pode usar o editor de fluxo sed para isso:

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

caminho Perl:

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

Isso pode ser usado em vários arquivos em uma pasta da seguinte forma:

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

API Python e 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"}

E aqui está o script em si:

#!/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")
    
por Sergiy Kolodyazhnyy 24.01.2017 / 19:14