Bash: 需要替换文件中的不同电子邮件地址
Bash: Need to replace different email addresses within a file
我正在尝试在文件 (.json) 中屏蔽 PII。
该文件包含不同的电子邮件地址,我想将它们更改为其他不同的电子邮件地址。
例如:
"results":
[{ "email1@domain1.com",
"email2@domain2.com",
"email3@domain3.com",
"email4@domain4.com",
"email5@domain5.com" }]
我需要将它们更改为:
"results":
[{ "mockemail1@mockdomain1.com",
"mockemail2@mockdomain2.com",
"mockemail3@mockdomain3.com",
"mockemail4@mockdomain4.com",
"mockemail5@mockdomain5.com" }]
使用 sed 和 regex 我已经能够将地址更改为模拟电子邮件地址之一,但我想将每封电子邮件更改为不同的模拟电子邮件。
模拟电子邮件地址存储在一个文件中。要获得随机地址,我使用:
RandomEmail=$(shuf -n 1 Mock_data.csv | cut -d "|" -f 3)
有什么想法吗?谢谢!
我将 emailX@domainX.com
的第一个文件保存到 /tmp/1
。我用 mockemails 的内容创建了一个文件 /tmp/2
:
mockemail1@mockdomain1.com
mockemail2@mockdomain2.com
mockemail3@mockdomain3.com
mockemail4@mockdomain4.com
mockemail5@mockdomain5.com
首先,我从 /tmp/1
中提取了一个电子邮件地址列表,然后随机播放模拟邮件。然后我加入使用粘贴电子邮件,在列上打乱乱序的模拟邮件。然后我将格式 email mockemail
中的行转换为 sed 参数 s/email/mockemail/;
并将其传递给 sed。然后我调用 sed 将电子邮件替换为随机模拟邮件,将 /tmp/1
文件作为标准输入传递。
sed "$(paste <(cat /tmp/1 | sed -n '/@/{s/.*"\(.*@.*.com\)".*//;/^$/d;p;}') <(shuf /tmp/2) | sed 's#\(.*\)\t\(.*\)#s///#' | tr '\n' ';')" </tmp/1
这会产生:
"results":
[{ "mockemail1@mockdomain1.com",
"mockemail3@mockdomain3.com",
"mockemail5@mockdomain5.com",
"mockemail4@mockdomain4.com",
"mockemail2@mockdomain2.com" }]
使用 python
的快速而肮脏的实施:
假设:
你有一个格式正确的 JSON 输入:
{
"results":
[
"email1@domain1.com",
"email2@domain2.com",
"email3@domain3.com",
"email4@domain4.com",
"email5@domain5.com"
]
}
您可以在此地址 https://jsonformatter.curiousconcept.com/
验证您的 JSON
代码:
import json
import sys
input_message = sys.stdin.read()
json_dict = json.loads(input_message)
results=[]
for elem in json_dict['results']:
results.append("mock"+elem)
results_dict = {}
results_dict['results']=results
print(json.dumps(results_dict))
命令:
$ echo '{"results":["email1@domain1.com","email2@domain2.com","email3@domain3.com","email4@domain4.com","email5@domain5.com"]}' | python jsonConvertor.py
{"results": ["mockemail1@domain1.com", "mockemail2@domain2.com", "mockemail3@domain3.com", "mockemail4@domain4.com", "mockemail5@domain5.com"]}
input.json
您已获得 JSON 文件(在此示例中未出现的末尾添加额外的分界线,否则 bash 中的读取功能将无法正常工作)
"results":
[{ "email1@mockdomain1.com",
"email2@mockdomain2.com",
"email3@mockdomain3.com",
"email4@mockdomain4.com",
"email5@mockdomain5.com" }]
substitutions.txt
(在本示例中未出现的末尾添加一个额外的分界线,否则 bash 中的读取功能将无法正常工作)
domain1.com;mockdomain1.com
domain2.com;mockdomain2.com
domain3.com;mockdomain3.com
domain4.com;mockdomain4.com
domain5.com;mockdomain5.com
script.sh
#!/bin/bash
while read _line; do
unset _ResultLine
while read _subs; do
_strSearch=$(echo $_subs | cut -d";" -f1)
_strReplace=$(echo $_subs | cut -d";" -f2)
if [ "$(echo "$_line" | grep "@$_strSearch")" ]; then
echo "$_line" | awk -F"\t" -v strSearch=$_strSearch -v strReplace=$_strReplace \
'{sub(strSearch,strReplace); print }' >> output.json
_ResultLine="ok"
fi
done < substitutions.txt
[ "$_ResultLine" != "ok" ] && echo "$_line" >> output.json
done < input.json
ouput.json
"results":
[{ "email1@mockdomain1.com",
"email2@mockdomain2.com",
"email3@mockdomain3.com",
"email4@mockdomain4.com",
"email5@mockdomain5.com" }]
我的一个朋友提出了以下分两部分工作的优雅解决方案:
用字符串替换电子邮件地址。
sed -E -i 's/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b/EMAIL_TO_REPLACE/g' data.json
迭代文件,并在每次迭代中用文件中的随机电子邮件替换字符串的第一次出现:
for email in $(egrep -o EMAIL_TO_REPLACE data.json) ; do
sed -i '0,/EMAIL_TO_REPLACE/s//'"$(shuf -n 1 Mock_data.csv | cut -d "|" -f 3)"'/' data.json ;
done
就是这样。
谢谢艾琳娜!
给定这些输入文件:
$ cat file1
"results":
[{ "email1@domain1.com",
"email2@domain2.com",
"email3@domain3.com",
"email4@domain4.com",
"email5@domain5.com" }]
$ cat file2
foo|bar|mockemail1@mockdomain1.com|etc
foo|bar|mockemail2@mockdomain2.com|etc
foo|bar|mockemail3@mockdomain3.com|etc
foo|bar|mockemail4@mockdomain4.com|etc
foo|bar|mockemail5@mockdomain5.com|etc
您只需要:
$ shuf file2 | awk 'NR==FNR{a[NR]=;next} /@/{=a[++c]} 1' FS='|' - FS='"' OFS='"' file1
"results":
[{ "mockemail2@mockdomain2.com",
"mockemail4@mockdomain4.com",
"mockemail5@mockdomain5.com",
"mockemail1@mockdomain1.com",
"mockemail3@mockdomain3.com" }]
我正在尝试在文件 (.json) 中屏蔽 PII。
该文件包含不同的电子邮件地址,我想将它们更改为其他不同的电子邮件地址。
例如:
"results":
[{ "email1@domain1.com",
"email2@domain2.com",
"email3@domain3.com",
"email4@domain4.com",
"email5@domain5.com" }]
我需要将它们更改为:
"results":
[{ "mockemail1@mockdomain1.com",
"mockemail2@mockdomain2.com",
"mockemail3@mockdomain3.com",
"mockemail4@mockdomain4.com",
"mockemail5@mockdomain5.com" }]
使用 sed 和 regex 我已经能够将地址更改为模拟电子邮件地址之一,但我想将每封电子邮件更改为不同的模拟电子邮件。
模拟电子邮件地址存储在一个文件中。要获得随机地址,我使用:
RandomEmail=$(shuf -n 1 Mock_data.csv | cut -d "|" -f 3)
有什么想法吗?谢谢!
我将 emailX@domainX.com
的第一个文件保存到 /tmp/1
。我用 mockemails 的内容创建了一个文件 /tmp/2
:
mockemail1@mockdomain1.com
mockemail2@mockdomain2.com
mockemail3@mockdomain3.com
mockemail4@mockdomain4.com
mockemail5@mockdomain5.com
首先,我从 /tmp/1
中提取了一个电子邮件地址列表,然后随机播放模拟邮件。然后我加入使用粘贴电子邮件,在列上打乱乱序的模拟邮件。然后我将格式 email mockemail
中的行转换为 sed 参数 s/email/mockemail/;
并将其传递给 sed。然后我调用 sed 将电子邮件替换为随机模拟邮件,将 /tmp/1
文件作为标准输入传递。
sed "$(paste <(cat /tmp/1 | sed -n '/@/{s/.*"\(.*@.*.com\)".*//;/^$/d;p;}') <(shuf /tmp/2) | sed 's#\(.*\)\t\(.*\)#s///#' | tr '\n' ';')" </tmp/1
这会产生:
"results":
[{ "mockemail1@mockdomain1.com",
"mockemail3@mockdomain3.com",
"mockemail5@mockdomain5.com",
"mockemail4@mockdomain4.com",
"mockemail2@mockdomain2.com" }]
使用 python
的快速而肮脏的实施:
假设:
你有一个格式正确的 JSON 输入:
{
"results":
[
"email1@domain1.com",
"email2@domain2.com",
"email3@domain3.com",
"email4@domain4.com",
"email5@domain5.com"
]
}
您可以在此地址 https://jsonformatter.curiousconcept.com/
验证您的 JSON代码:
import json
import sys
input_message = sys.stdin.read()
json_dict = json.loads(input_message)
results=[]
for elem in json_dict['results']:
results.append("mock"+elem)
results_dict = {}
results_dict['results']=results
print(json.dumps(results_dict))
命令:
$ echo '{"results":["email1@domain1.com","email2@domain2.com","email3@domain3.com","email4@domain4.com","email5@domain5.com"]}' | python jsonConvertor.py
{"results": ["mockemail1@domain1.com", "mockemail2@domain2.com", "mockemail3@domain3.com", "mockemail4@domain4.com", "mockemail5@domain5.com"]}
input.json 您已获得 JSON 文件(在此示例中未出现的末尾添加额外的分界线,否则 bash 中的读取功能将无法正常工作)
"results":
[{ "email1@mockdomain1.com",
"email2@mockdomain2.com",
"email3@mockdomain3.com",
"email4@mockdomain4.com",
"email5@mockdomain5.com" }]
substitutions.txt (在本示例中未出现的末尾添加一个额外的分界线,否则 bash 中的读取功能将无法正常工作)
domain1.com;mockdomain1.com
domain2.com;mockdomain2.com
domain3.com;mockdomain3.com
domain4.com;mockdomain4.com
domain5.com;mockdomain5.com
script.sh
#!/bin/bash
while read _line; do
unset _ResultLine
while read _subs; do
_strSearch=$(echo $_subs | cut -d";" -f1)
_strReplace=$(echo $_subs | cut -d";" -f2)
if [ "$(echo "$_line" | grep "@$_strSearch")" ]; then
echo "$_line" | awk -F"\t" -v strSearch=$_strSearch -v strReplace=$_strReplace \
'{sub(strSearch,strReplace); print }' >> output.json
_ResultLine="ok"
fi
done < substitutions.txt
[ "$_ResultLine" != "ok" ] && echo "$_line" >> output.json
done < input.json
ouput.json
"results":
[{ "email1@mockdomain1.com",
"email2@mockdomain2.com",
"email3@mockdomain3.com",
"email4@mockdomain4.com",
"email5@mockdomain5.com" }]
我的一个朋友提出了以下分两部分工作的优雅解决方案:
用字符串替换电子邮件地址。
sed -E -i 's/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b/EMAIL_TO_REPLACE/g' data.json
迭代文件,并在每次迭代中用文件中的随机电子邮件替换字符串的第一次出现:
for email in $(egrep -o EMAIL_TO_REPLACE data.json) ; do sed -i '0,/EMAIL_TO_REPLACE/s//'"$(shuf -n 1 Mock_data.csv | cut -d "|" -f 3)"'/' data.json ; done
就是这样。
谢谢艾琳娜!
给定这些输入文件:
$ cat file1
"results":
[{ "email1@domain1.com",
"email2@domain2.com",
"email3@domain3.com",
"email4@domain4.com",
"email5@domain5.com" }]
$ cat file2
foo|bar|mockemail1@mockdomain1.com|etc
foo|bar|mockemail2@mockdomain2.com|etc
foo|bar|mockemail3@mockdomain3.com|etc
foo|bar|mockemail4@mockdomain4.com|etc
foo|bar|mockemail5@mockdomain5.com|etc
您只需要:
$ shuf file2 | awk 'NR==FNR{a[NR]=;next} /@/{=a[++c]} 1' FS='|' - FS='"' OFS='"' file1
"results":
[{ "mockemail2@mockdomain2.com",
"mockemail4@mockdomain4.com",
"mockemail5@mockdomain5.com",
"mockemail1@mockdomain1.com",
"mockemail3@mockdomain3.com" }]