我试图计算我在计算机上使用某个版本的库的次数。
由于某种原因,uniq -c
尽管对其进行了排序,并且尽管排序顺序似乎按顺序排列,但仍输出重复项。
有什么想法或反馈吗?
谢谢你的时间。
和uniq -c
输入:
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="(.+)">/\1 \2/g' | sort -n | uniq -c
输出:
3 GitVersion.MsBuild 5.10.1
1 GitVersion.MsBuild 5.10.1
3 GitVersion.MsBuild 5.10.3
11 GitVersion.MsBuild 5.11.1
5 GitVersion.MsBuild 5.11.1
25 GitVersion.MsBuild 5.12.0
2 GitVersion.MsBuild 5.12.0
1 GitVersion.MsBuild 5.6.11
2 GitVersion.MsBuild 5.7.0
4 GitVersion.MsBuild 5.8.1
没有uniq -c
输入:
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="(.+)">/\1 \2/g' | sort -n
输出:
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.1
GitVersion.MsBuild 5.10.3
GitVersion.MsBuild 5.10.3
GitVersion.MsBuild 5.10.3
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.11.1
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.12.0
GitVersion.MsBuild 5.6.11
GitVersion.MsBuild 5.7.0
GitVersion.MsBuild 5.7.0
GitVersion.MsBuild 5.8.1
GitVersion.MsBuild 5.8.1
GitVersion.MsBuild 5.8.1
GitVersion.MsBuild 5.8.1
我已经xxd
按照 @kos 的建议更新了我的命令以进行管道传输。这有助于比较。
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="([0-9\.]+)">/\1 \2/g' | sort -n | uniq -c | xxd
然后我稍微修改了正则表达式(抱歉,我没有采纳所有建议,因为一个微小的调整使它起作用,但我不得不说我从中学到了很多东西,包括使用xxd
)
我只是.*
在之后添加>
:
rg --no-line-number --no-filename -g '*.csproj' "GitVersion.MsBuild" | sed -E '/GitVersion\.MsBuild" Version/!d;s/^\s\+//g;/<!/d;s/^.+(GitVersion.MsBuild)" Version="([0-9\.]+)">.*$/\1 \2/g' | sort | uniq -c
现在它产生了正确的(或者无论如何令人满意的)输出:
4 GitVersion.MsBuild 5.10.1
3 GitVersion.MsBuild 5.10.3
16 GitVersion.MsBuild 5.11.1
27 GitVersion.MsBuild 5.12.0
1 GitVersion.MsBuild 5.6.11
2 GitVersion.MsBuild 5.7.0
4 GitVersion.MsBuild 5.8.1
感谢团队!
uniq -c
计算在用户区域设置中同等整理的连续行序列的长度(返回strcoll(line1, line2)
0)。如果你得到:
两条看似相同的行是连续的,这只能表明它们不相同(并且不相等地整理)。
最可能的解释是那里的隐形字符存在变化。
作为与 Microsoft 相关的文件,行尾可能有 CR 字符,尽管这也可能是空格或制表符,这些字符也可能自然出现在 XML 文件中。
您的代码可能应该是:
在哪里:
s/^\s\+//g
删除,因为它没有任何用途(即使固定为s/^\s+//
)。sort -n
(这是毫无意义的,因为行不以数字开头)替换为sort -V
(对于版本 sort,GNU 扩展)。.*
添加后,">
所以任何内容都会被丢弃,包括空格、制表符、CR 或任何其他不可见字符。g
删除,因为该模式只能匹配一次。sed -n
p
与 sed 命令的标志结合s
使用,以确保仅打印匹配的行。或者完成整个事情
rg
:或者
pcregrep
/pcre2grep
:(使用
--iglob
并且(?i)
据我所知,微软系统往往不关心文件名的大小写)如果这些确实是 XML 文件,您还可以使用 XML 感知实用程序来处理它们,例如
xq
: