Регулярное выражение почти наверняка будет неправильным подходом для этого, поскольку вы получите ложные совпадения, если вы не будете чрезвычайно осторожны и это неэффективно.
Просто создайте файл aliases
, содержащий строку для каждого имени, которое вы хотите в выводе, а затем все имена, которые должны быть сопоставлены с ним, и затем вы можете сделать это, чтобы изменить их все четко, просто, надежно, переносимо, и качественно за один звонок в awk:
$ cat tst.awk
BEGIN { FS="[|]" ; OFS="|" }
NR==FNR {
for (i=2; i<=NF; i++) {
alias[$i] = $1
}
next
}
$2 in alias { $2 = alias[$2] }
{ print }
.
$ cat aliases
John Doe|John|john_doe|Doe, John
Susan Barker|Susie B|Barker, Susan
.
$ cat file
1551272464|John|A|repo1/file1.txt
1551272464|Susie B|A|repo2/filex.py
1551272464|john_doe|A|repo1/folder/file9.py
1551272464|Doe, John|A|repo2/filex.py
1551272464|Barker, Susan|A|repo2/filex.py
.
$ awk -f tst.awk aliases file
1551272464|John Doe|A|repo1/file1.txt
1551272464|Susan Barker|A|repo2/filex.py
1551272464|John Doe|A|repo1/folder/file9.py
1551272464|John Doe|A|repo2/filex.py
1551272464|Susan Barker|A|repo2/filex.py