Regex 在MacOs上使用sed替换git日志中的名称(对于Gource)

Regex 在MacOs上使用sed替换git日志中的名称(对于Gource),regex,bash,git,macos,sed,Regex,Bash,Git,Macos,Sed,我正在努力制作一个关于我们软件开发项目的好的古尔塞视频。使用可以生成所有回购的组合git日志,包括: 首先gource——输出自定义日志../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, Joh

我正在努力制作一个关于我们软件开发项目的好的古尔塞视频。使用可以生成所有回购的组合git日志,包括: 首先
gource——输出自定义日志../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 | Committer name | A或D或C | committed file

我想解决的实际问题是,我的开发人员使用了具有不同提交者名称的不同git客户端,因此我想将它们的所有名称替换为一个版本。我不介意在每种情况下设置多个sed。 因此,找到“约翰”、“约翰·多伊”和“多伊,约翰”并用“约翰·多伊”替换它。这应该在我的MacBook上完成

所以我尝试了sed-I-r“s/John/user_John/g”combined.txt,但这里的问题是它找到了“John”和“Doe,John”,只替换了“John”部分,所以我需要进行模糊搜索并替换整个列


谁能帮我找到正确的正则表达式?

正如@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
选项向链添加更多替换:


正如@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
选项向链添加更多替换:


正则表达式几乎肯定是错误的方法,因为除非你非常小心,否则你会得到错误的匹配,而且效率很低

只需创建一个
别名
文件,其中包含输出中所需的每个名称的一行,后跟应映射到该名称的所有名称,然后您就可以通过一次对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 }


正则表达式几乎肯定是错误的方法,因为除非你非常小心,否则你会得到错误的匹配,而且效率很低

只需创建一个
别名
文件,其中包含输出中所需的每个名称的一行,后跟应映射到该名称的所有名称,然后您就可以通过一次对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 }

试试gnu-sed:

sed -E "s/^(\w+\|)(john([\s_]doe)?|doe,\s*john)/\1John Doe/i" combined.txt
检查后添加-i选项进行编辑
sed-Ei
..

尝试gnu-sed:

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

检查后添加-i选项进行编辑
sed-Ei

在第一个和第二个“|”
sed-i-r”s/Doe,John | John | Doe | John/user _John/g”combined.txt
可以。在第一个和第二个“| code>sed-i-r”s/Doe,John | John Doe | John Doe | John John/user | u John g”combined.txt之间取字符串。这是一个更优雅的解决方案!我将它集成到我的bash脚本中,并像一个符咒一样工作。也非常快。这是一个更优雅的解决方案!我将它集成到我的bash脚本中,并像一个符咒一样工作。也很快。