Добавьте некоторый текст вокруг адресов электронной почты в нескольких файлах

У меня есть много текстовых файлов в папке. Текст в них находится в этом формате:

%%%%%%%%%%@yahoo.com
%%%%%%@wanadoo.fr
%%%%raviplywoodglasscentre@yahoo.comravi
%%nameemail%%@yahoo.com
%.getincontact@numberland.com
%0dronbracale@roadrunner.com
%1%3@example.com
%1@elsewhere.com
%1@example.com

Я хочу внести изменения во всем тексте файлов и сделать их как следующее:

{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%raviplywoodglasscentre@yahoo.comravi"}
{"email":"%%nameemail%%@yahoo.com"}

Я хочу сделать полные файлы как это, которые находятся в папке.
Я попробовал это:

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

но это не работало.

Так, есть ли какой-либо способ, которым я могу изменить текст во всех файлах в папке как это?

4
задан 24 January 2017 в 03:49

5 ответов

$ sed 's/.*/{"email":"&"}/' file
{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%raviplywoodglasscentre@yahoo.comravi"}
{"email":"%%nameemail%%@yahoo.com"}
{"email":"%.getincontact@numberland.com"}
{"email":"%0dronbracale@roadrunner.com"}
{"email":"%1%3@example.com"}
{"email":"%1@elsewhere.com"}
{"email":"%1@example.com"}

Так для действия на все файлы Вы могли сделать

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

Для хранения копии старых файлов

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

, Объяснение

  • -i.old изменяет файлы на месте вместо того, чтобы печатать к stdout и сохраняет копию каждого файла перед модификацией с расширением .old
  • s/old/new замена old с new
  • .* любые символы на строке
  • & подобранный шаблон
6
ответ дан 23 November 2019 в 11:35

С awk, используйте переменное присвоение для удаления одного уровня заключения в кавычки:

awk -v format='{"email":"%s"}\n' '{printf format, $1}'
4
ответ дан 23 November 2019 в 11:35

Вы могли использовать потокового редактора sed для этого:

sed -e 's/\(^.*\)$/{"email":"\1"}/g' source.txt
1
ответ дан 23 November 2019 в 11:35

Несомненно более подробный, но отредактировать все файлы в каталоге:

  1. Если каталог является плоским:

    #!/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. Если каталог является рекурсивным, и необходимо преобразовать файлы в subdirs также:

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

В обоих случаях содержание файла изменяется в:

{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%raviplywoodglasscentre@yahoo.comravi"}
{"email":"%%nameemail%%@yahoo.com"}
{"email":"%.getincontact@numberland.com"}
{"email":"%0dronbracale@roadrunner.com"}
{"email":"%1%3@example.com"}
{"email":"%1@elsewhere.com"}
{"email":"%1@example.com"}

Использовать его

  1. Скопируйте сценарий (любой один) в пустой файл, сохраните его как edit_files.py
  2. Выполните его с каталогом как аргумент:

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

Примечание:

Это предполагает, что все строки во всех файлах должны быть отредактированы. Упомяните, должны ли мы установить условие или для один, или для оба.

5
ответ дан 23 November 2019 в 11:35

Perl путь:

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

Это может использоваться на нескольких файлах в папке как так:

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

Python и json API:

$ 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": "%%%%raviplywoodglasscentre@yahoo.comravi"}
{"email": "%%nameemail%%@yahoo.com"}

И вот сам сценарий:

#!/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
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

Похожие вопросы: