关键词:linux命令 grep sed 正则表达式 sort

在生成Crypto++密码库的时候遇到一些编译和连接错误。经过分析发现是因为project中没有添加源码目录下的个别源文件。Crypto++源码目录下默认提供VS2010的Solution。官方文档上说当前版本支持从VS2003-2017的编译器,实际上只提供VS2005和VS2010两个Solution,VS2005的Solution在源码目录下的压缩文件VS2005.zip中。我是在编译VS2005的Soluntion出现的错误。在解决了几个错误之后,发现是由于源码目录下的某些源文件没有加入到对应的project中,猜测可能是由于作者在默认的VS2010工程中编译测试通过,没有将工程改动及时更新到VS2005工程。

如果一个错误一个错误地解决,加入一个源文件之后又产生了其他错误,非常浪费时间。如果打开两个project文件人工比对VS2010 Project比VS2005 Project,不仅慢还容易出错。那么如何才能快速比较出VS2010和VS2005两个Project有哪些差异?

VS2010和VS2005的Project虽然在文件结构上有很大不同,但无非是包含源文件和配置信息。只要从VS2010 Project找出包含了哪些CPP文件,再与VS2005 Project包含的CPP文件进行比较,看看多出了哪些CPP文件,问题就解决了。

 

在Project文件中查找包含.cpp的行

Project文件中包含的CPP如下图所示

如何高效地比较两个文件

如果只查找CPP关键字,任何一个文本工具都能办到,但是这样的搜索结果会多出一些无用的信息。为了能让一个关键字匹配出类似cryptlib.cpp integer.cpp base32.cpp这种格式的结果,需要使用正则表达式。在正则表达式中

符号'.'表示任意单个字符

符号'*'表示重复前一个字符0次或多次,我们常常用'.*'来匹配任意长度的字符串

从图中知道源文件信息以符号"开始,所以我们这样做

grep -n "\".*.cpp" cryptlib.vcxproj

grep会逐行分析文本文件,并把包含匹配结果的行显示出来。-n选项会显示所在的行号,这里只是方便观察,后边进行其他处理时应该去掉该选项。在双引号中匹配符号",我们需要使用转义符号"\"来指明符号"应该被当作一个普通字符进行匹配,否则命令无法执行。比如正则表达式中的第二个符号'.'被当作通配符匹配任意字符,stdcpp这种形式的字符串也会作为匹配结果。我们可以使用转移符号"\"使'.'被当作普通字符,以得到更准确的匹配结果。

grep -n "\".*\.cpp" cryptlib.vcxproj

如何高效地比较两个文件

 

从匹配到的行中得到结果字符串

上边找到了.cpp文件所在的行,但是把整行信息都显示出来了。如何只显示匹配到的字符串,过滤掉行内的其他信息呢?我们可以使用grep命令的-o选项,该选项控制输出结果只显示匹配到的字符串

如何高效地比较两个文件

 

删除结果字符串中的引号

为了删除字符串中的符号",我们可以使用linux中的sed命令。grep是命令逐行查找文本,sed命令是逐行编辑文本。sed的命令格式是这样的

sed 's/oldstring/goalstring/g' file

引号中间的是脚本指令。该指令被符号/分为4个部分,s表示替换操作。该指令的意思是使用goalstring替换oldstring 。第4部分g表示是否全部替换,如果一行中有两处oldstring,则全部替换成goalstring,如果没有g则只替换第一次出现的oldstring。删除每行中的符号",就是使用空字符替换掉字符串中的符号"。所以命令应该这样写

grep -o "\".*\.cpp" cryptlib.vcxproj | sed 's/"//'

我们在这里使用了管道符号'|'把grep的匹配结果传给sed命令处理,为了使每一行只包含文件名,应该去掉grep命令的-n选项,不再输出行号。

如何高效地比较两个文件

 

通过以上的操作我们就得到了cryptlib.vcxproj工程中包含的所有源文件,并且每行只包含一个文件。使用重定向符号>将结果保存在文本文件中,再使用同样的方法再得到VS2005工程cryptlib.vcproj中的所有源文件。最后我们使用比较工具beyond compare对两个文本文件进行比较,就可以快速找到cryptlib.vcxproj(VS2010)和cryptlib.vcproj(VS2005)两个工程的差异。

 

对输出结果进行排序

使用beyond compare比较的时候,由于文件名没有排序,会给我们的比对造成一定障碍。可以beyond compare工具中排序功能对源文件进行排序,也可以使用linux中sort命令对sed命令结果进行处理后再保存。具体的命令为

grep -o "\".*\.cpp" cryptlib.vcxproj|sed 's/"//'|sort

相关文章:

  • 2021-10-27
  • 2021-07-19
  • 2021-10-20
  • 2021-12-29
  • 2021-05-23
  • 2021-10-19
  • 2021-05-20
猜你喜欢
  • 2022-12-23
  • 2021-12-02
  • 2021-06-26
  • 2021-12-03
  • 2022-01-20
  • 2021-08-13
  • 2022-01-24
相关资源
相似解决方案