如何在使用 wC语言 m 计算多个文件的字符数时忽略'r'



我试图计算作者提交给git的字符数"JohnJohnson";使用此命令:

wc -m $(git log --use-mailmap --no-merges --author="JohnJohnson" --name-only --pretty=format:"" | sort -u)

问题是,在Linux和Windows(git-bash(上,它会产生不同的结果,至少因为在Windows上,新行由两个字符"\r\n"组成。有没有一种方法可以让wc-m忽略'\r',这样我就可以用相同的命令在两个操作系统上获得一致的结果?

注意:虽然在运行wc -m之前对每个文件运行dos2unix就足够了,但我假设a(dos2unix不可用和/或b(OP可能会发现除r之外还有其他字符需要删除。


假设目标是生成与wc -m相同的精确输出,使用用户定义函数的一个想法是:

my_wc () {
local charcount=0 totcount=0
for fname in $@
do
charcount=$(tr -d 'r' < $fname | wc -m)
echo "$charcount $fname" 
((totcount+=charcount))
done
echo "$totcount total"
}

应用于OP的例子:

my_wc $(git log --use-mailmap --no-merges --author="JohnJohnson" --name-only --pretty=format:"" | sort -u)

如果OP找到要跳过的其他字符(除了r(,则将它们添加到tr -d 'r'调用中(。


另一个功能想法,但这个使用awk:

my_wc() {
awk 'BEGIN { RS="^$" }                  # whole file becomes one single, long record
{ gsub("r","")
n=length($0)
tot+=n
print n,FILENAME
}
END   { print tot,"total"}' $@
}

在几个示例文件上演示这些功能:

$ head f?
==> f1 <==
a       13
a       5
b       7
a       20
a       3
==> f2 <==
a       13
a       5
b       7
a       20
a       3
==> f3 <==
a       13
a       5
b       7
a       20
a       3
$ dos2unix f?
$ wc -m f?
22 f1
22 f2
22 f3
66 total
$ unix2dos f?
$ wc -m f?
27 f1
27 f2
27 f3
81 total
$ my_wc f?
22 f1
22 f2
22 f3
66 total

在配置为在工作树中不进行换行转换的repo中操作,即关闭eol处理。您可以在任何地方进行操作,例如git config core.eol false。避免干扰的最简单方法可能是在一个临时克隆中这样做

git clone -ns . `mktemp -d`; cd $_
git config core.eol false
git checkout

现在你得到了一个没有应用eol munging的原始结账。

最新更新