UNIX';通信';实用程序允许BSD中的大小写不敏感,但不允许Linux(通过-i标志)。如何在Linux中获得它?
我在BSD平台(OSX)上开发的应用程序中使用了出色的UNIX“comm”命令行实用程序。当我部署到我的Linux生产服务器时,我发现不幸的是,Ubuntu Linux的“comm”实用程序没有使用-I标志来表示这些行应该不区分大小写。显然,POSIX标准不需要-i选项 所以。。。我左右为难。我真的需要在BSD上运行良好的-I选项。到目前为止,我一直在尝试在Linux box上编译BSD comm.c源代码,但我得到了: 对于如何在Linux上获得支持“comm-i”的comm版本,有人有什么建议吗UNIX';通信';实用程序允许BSD中的大小写不敏感,但不允许Linux(通过-i标志)。如何在Linux中获得它?,unix,command-line,case-insensitive,bsd,Unix,Command Line,Case Insensitive,Bsd,我在BSD平台(OSX)上开发的应用程序中使用了出色的UNIX“comm”命令行实用程序。当我部署到我的Linux生产服务器时,我发现不幸的是,Ubuntu Linux的“comm”实用程序没有使用-I标志来表示这些行应该不区分大小写。显然,POSIX标准不需要-i选项 所以。。。我左右为难。我真的需要在BSD上运行良好的-I选项。到目前为止,我一直在尝试在Linux box上编译BSD comm.c源代码,但我得到了: 对于如何在Linux上获得支持“comm-i”的comm版本,有人有什么
谢谢 您可以在
comm.c
中添加以下内容:
void *reallocf(void *ptr, size_t size)
{
void *ret = realloc(ptr, size);
if (ret == NULL) {
free(ptr);
}
return ret;
}
你应该可以编译它了。确保comm.c
中有#包含(它可能已经这样做了)
编译失败的原因是BSDcomm.c
使用了reallocf()
,这不是标准的c函数。但是写起来很容易
对于如何在Linux上获得支持“comm-i”的comm版本,有人有什么建议吗
不完全是这样;但是您是否检查了join
实用程序是否可以满足您的需求?这一个在Linux上确实有-i
选项…@OP,没有必要到这样的长度来编译您自己的src代码。这里有另一个建议。由于您希望不区分大小写,因此在将文件传递给comm之前,您可以使用另一个工具(如tr
)将两个文件中的大小写转换为小写(或大写)
tr '[A-Z]' '[a-z]' <file1 > temp1
tr '[A-Z]' '[a-z]' <file2 > temp2
comm temp1 temp2
tr'[A-Z]'[A-Z]'temp1
tr'[A-Z]'[A-Z]'temp2
通信临时1临时2
您可以尝试对这两个文件进行cat,并通过管道将它们传输到uniq-c-i。它将显示两个文件中的所有行,在第一列中显示外观数。只要原始文件没有重复的行,第一列>1的所有行都是两个文件共有的行
希望有帮助 是的,我考虑过这一点,但我实际上需要在比较过程中折叠大小写,然后保留结果中字符的原始大小写。谢谢你的建议!有趣的实用程序,但我需要通信。谢谢!不幸的是,虽然utf-8编码的文件可以正常工作,但它不能处理拉丁文1编码的文件。有没有办法处理这个问题?comm:/path/to/file:无效或不完整的多字节或宽character@Sam:您的环境变量是什么<代码>echo$LANG
。你应该好好利用它:将它设置为C
,或en_US.UTF-8
,等等。有一个--忽略大小写
选项,但它从未实现过。
tr '[A-Z]' '[a-z]' <file1 > temp1
tr '[A-Z]' '[a-z]' <file2 > temp2
comm temp1 temp2