我正在试着在我们的软件开发项目上制作一个很好的Gource视频。使用Gource a可以生成所有repos的组合git日志:首先是gource --output-custom-log ../logs/repo1.txt,然后是cat *.txt | sort -n > combined.txt。这将生成一个combined.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客户端,所以我希望将它们的所有名称都替换为一个版本。我不介意在每种情况下设置多个sed。所以找到" John“,"john_doe”和"Doe,John“,并用"John Doe”代替它。它应该在我的MacBook上完成。
所以我尝试了sed -i -r "s/John/user_john/g" combined.txt,但这里的问题是,它找到了"John“和"Doe,John”,并且只替换了"John“部分,所以我需要做一个模糊搜索,并替换整个列。
谁能帮助我获得正确的正则表达式?
发布于 2019-04-16 05:17:22
正则表达式几乎肯定是错误的方法,因为除非您非常小心,否则会得到错误的匹配,而且效率很低。
只需创建一个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发布于 2019-04-16 08:42:34
尝试gnu sed:
sed -E "s/^(\w+\|)(john([\s_]doe)?|doe,\s*john)/\1John Doe/i" combined.txt检查编辑后添加-i选项;sed -Ei...
https://stackoverflow.com/questions/55696604
复制相似问题