Замените имена в git log используя sed на MacOs (для Gource) - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь сделать хорошее видео на нашем проекте по разработке программного обеспечения.Использование Gource a может сгенерировать объединенный журнал git всех репозиториев с: first gource --output-custom-log ../logs/repo1.txt затем cat *.txt | sort -n > combined.txt. Этот файл генерирует комбинированный файл .txt, который представляет собой файл с разделителями каналов, например:

1551272464|John|A|repo1/file1.txt
1551272464|john_doe|A|repo1/folder/file9.py
1551272464|Doe, John|A|repo2/filex.py

Итак, это: EPOCH | Имя коммиттера | A или D или C | зафиксированный файл

Фактическая проблема, которую я хочу решить, заключается в том, что мои разработчики использовали разные git-клиенты с разными именами коммиттеров, поэтому id нравитсязаменить все их имена на одну версию.Я не против установки нескольких sed для каждой ситуации.Так что найдите «Джон», «john_doe» и «Доу, Джон» и замените его на «Джон Доу».И это должно быть сделано на моем MacBook.

Итак, я попытался sed -i -r "s/John/user_john/g" combined.txt, но проблема здесь в том, что он находит «Джон» и «Доу, Джон» и заменяет только часть «Джон», поэтому янужно сделать нечеткий поиск и заменить весь столбец.

Кто может помочь мне получить правильное регулярное выражение?

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

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

Просто создайте файл 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
0 голосов
/ 16 апреля 2019

попробуйте GNU SED:

sed -E "s/^(\w+\|)(john([\s_]doe)?|doe,\s*john)/\1John Doe/i" combined.txt

добавить опцию -i после проверки, чтобы отредактировать ее; sed -Ei ...

0 голосов
/ 15 апреля 2019

Как уже упоминалось @WiktorStribizew, вы можете сделать:

sed -i -r "s/Doe, John|john_doe|John/user_john/g" combined.txt

И с этим вы даже можете сделать:

sed -i -r -e "s/Doe, John|john_doe|John/user_john/g" -e "s/Wayne, Bruce|bruce_wayne|Bruce/user_bruce/g" combined.txt

И добавить больше замен в цепочку с помощью -eопция:

   -e script, --expression=script
          add the script to the commands to be executed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...