Bash: необходимо заменить разные адреса электронной почты в файле
Я пытаюсь замаскировать PII в файле (.json).
Файл содержит разные адреса электронной почты, и я хотел бы изменить их на другие адреса электронной почты.
Например:
"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)
Есть идеи? Спасибо!
5 ответов
input.json У вас есть файл JSON (в конце добавьте дополнительную строку перерыва, которая не отображается в этом примере, или функция чтения в bash не будет работать правильно)
"results":
[{ "email1@mockdomain1.com",
"email2@mockdomain2.com",
"email3@mockdomain3.com",
"email4@mockdomain4.com",
"email5@mockdomain5.com" }]
replacetions.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 $1}' >> 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" }]
Я сохранил первый файл с emailX@domainX.com
в /tmp/1
, Я создал файл /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 для замены электронных писем на случайную передачу mockemail /tmp/1
файл как стандартный
sed "$(paste <(cat /tmp/1 | sed -n '/@/{s/.*"\(.*@.*.com\)".*/\1/;/^$/d;p;}') <(shuf /tmp/2) | sed 's#\(.*\)\t\(.*\)#s/\1/\2/#' | tr '\n' ';')" </tmp/1
Это производит:
"results":
[{ "mockemail1@mockdomain1.com",
"mockemail3@mockdomain3.com",
"mockemail5@mockdomain5.com",
"mockemail4@mockdomain4.com",
"mockemail2@mockdomain2.com" }]
Учитывая эти входные файлы:
$ 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]=$3;next} /@/{$2=a[++c]} 1' FS='|' - FS='"' OFS='"' file1
"results":
[{ "mockemail2@mockdomain2.com",
"mockemail4@mockdomain4.com",
"mockemail5@mockdomain5.com",
"mockemail1@mockdomain1.com",
"mockemail3@mockdomain3.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
Выполните итерацию файла, и на каждой итерации заменяйте 1-е появление строки случайным письмом из файла:
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
И это все.
Спасибо, Элина!
Быстрая и грязная реализация с python
:
гипотеза:
У вас хорошо сформированный JSON-ввод:
{
"results":
[
"email1@domain1.com",
"email2@domain2.com",
"email3@domain3.com",
"email4@domain4.com",
"email5@domain5.com"
]
}
вы можете проверить свой JSON по этому адресу https://jsonformatter.curiousconcept.com/
код:
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"]}