在多个文件中的电子邮件地址周围添加一些文本

在多个文件中的电子邮件地址周围添加一些文本

我文件夹中有许多文本文件。其中的文本格式如下:

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

我想对所有文件文本进行更改,使它们如下所示:

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

我想制作像这样的完整文件,它们位于一个文件夹中。
我试过这个:

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

但它不起作用。

那么,有没有什么方法可以让我修改这样的文件夹中所有文件的文本?

答案1

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

因此,要对所有文件采取行动,你可以这样做

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

保留旧文件的副本

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

解释

  • -i.old就地修改文件,而不是打印到标准输出,并在修改之前使用扩展名保存每个文件的副本.old
  • s/old/newold用。。。来代替new
  • .*行中的任何字符
  • &匹配的模式

答案2

毫无疑问更加冗长,但要编辑目录内的所有文件:

  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. 如果目录是递归的,并且您还需要转换子目录中的文件:

    #!/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":"%%%%[email protected]"}
{"email":"%%nameemail%%@yahoo.com"}
{"email":"%[email protected]"}
{"email":"%[email protected]"}
{"email":"%1%[email protected]"}
{"email":"%[email protected]"}
{"email":"%[email protected]"}

使用它

  1. 将脚本(任意一个)复制到一个空文件中,并将其另存为edit_files.py
  2. 使用目录作为参数运行它:

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

笔记

这假设所有线路里面全部文件需要编辑。请说明我们是否需要为其中一个或两个设置条件。

答案3

使用awk,使用变量赋值来删除一级引用:

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

答案4

Perl 方式:

$ perl -lane 'print "{\"email\":\"$_\"}"' input.txt                                                                      
{"email":"%%%%%%%%%%@yahoo.com"}
{"email":"%%%%%%@wanadoo.fr"}
{"email":"%%%%[email protected]"}
{"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": "%%%%[email protected]"}
{"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")

相关内容