Beyond Compare 4:如何只显示包含特定字符串的行?
Beyond Compare 4: How to show only lines containing a specific string?
我正在尝试比较两个包含事务列表的日志文件。这些事务的字段是在行本身中定义的。例如:
transactionID: 1, transactionType: 6, transactionData: 123456
transactionID: 2, transactionType: 6, transactionData: 654321
在一个日志文件中,transactionType 6 事务可能连续出现,而在另一个文件中,它们可能与其他事务类型交错出现。因此,虽然 transactionID 可能不同,但它们仍将处于相同的顺序并包含相同的数据。
我如何过滤或仅显示包含字符串"transactionType: 6"的两个文件中的行?这将过滤掉所有其他交易,让我只看到类型 6 的交易。
谢谢。
Beyond Compare 4.1.1(当前版本)无法满足您的要求。
最接近您所描述内容的是仅显示与特定字符串匹配的文本中的差异。
使用 Define Unimportant Text in Beyond Compare 指令定义匹配“.transactionType: 6.”的正则表达式语法元素。
定义语法元素后,单击规则工具栏按钮(裁判图标)。在“重要性”选项卡中,选中新语法元素旁边的框并取消选中所有其他语法元素以使其不重要。这只会突出显示与您定义的语法元素匹配的行中的差异。
这是我在 BC4 中实现所需行为的方法。
BC 在打开文件进行比较时支持 运行 和 "pre-processor" 应用程序。
所以我所做的是制作一个简单的可执行文件,它带有 3 个参数 (argv[]):
- 原始文件的路径
- 处理后的文件路径(BC最终会打开对比)
- 包含以行分隔的搜索子字符串的 txt 文件的路径(更多内容见下文)
上面的项目编号 3 可以只包含一个条目(使用与原始问题相同的示例),例如 "transactionType: 6"。然后,可执行文件会在原始文件(上面的第 1 项)的每一行中搜索上面第 3 项中定义的搜索子字符串。每次命中时,整行都被复制(附加)到输出文件中(上面的第 2 项)。
接下来,您需要在 BC 中定义文件格式(在 Mac 上,您转到 Beyond Compare 菜单并单击 File Formats ...)。 Select 您文件的扩展名,然后单击 转换 选项卡。使用下面的屏幕截图作为示例。
注:%s是BC定义的指原文件(第1项)的路径,%t指的是处理文件的路径(第2项)。
因此,当您打开 File1.txt 和 File2.txt 为了进行比较,BC 将调用您的可执行文件(每个执行一次),然后打开生成的文件(第 2 项)。这将有效地显示两个文件的 "filtered" 版本,仅显示包含搜索子字符串的行。
另请注意,%t 参数将是 BC 内部生成的某种临时路径。
下面是上述可执行文件的快速实现:
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
int main(int argc, const char * argv[])
{
ifstream inputFile (argv[1]);
ifstream substringFile (argv[3]);
ofstream outputFile;
outputFile.open(argv[2]);
//build the list of substrings from the substring input file
list<string> substringList;
string line;
//TODO: make this safer
while (getline(substringFile, line))
{
substringList.push_back(line);
}
//for each substring in the list
for (list<string>::const_iterator iter = substringList.begin(); iter != substringList.end(); iter++)
{
if (inputFile.is_open())
{
//for all the lines in the file
while (getline(inputFile, line))
{
//Find the current substring
if (line.find(*iter) != string::npos)
{
outputFile << line << "\n";
}
}
}
//go back to the beginning of the file
inputFile.clear();
inputFile.seekg(0, ios::beg);
}
inputFile.close();
outputFile.close();
return 0;
}
希望对您有所帮助!
我正在尝试比较两个包含事务列表的日志文件。这些事务的字段是在行本身中定义的。例如:
transactionID: 1, transactionType: 6, transactionData: 123456
transactionID: 2, transactionType: 6, transactionData: 654321
在一个日志文件中,transactionType 6 事务可能连续出现,而在另一个文件中,它们可能与其他事务类型交错出现。因此,虽然 transactionID 可能不同,但它们仍将处于相同的顺序并包含相同的数据。
我如何过滤或仅显示包含字符串"transactionType: 6"的两个文件中的行?这将过滤掉所有其他交易,让我只看到类型 6 的交易。
谢谢。
Beyond Compare 4.1.1(当前版本)无法满足您的要求。
最接近您所描述内容的是仅显示与特定字符串匹配的文本中的差异。
使用 Define Unimportant Text in Beyond Compare 指令定义匹配“.transactionType: 6.”的正则表达式语法元素。
定义语法元素后,单击规则工具栏按钮(裁判图标)。在“重要性”选项卡中,选中新语法元素旁边的框并取消选中所有其他语法元素以使其不重要。这只会突出显示与您定义的语法元素匹配的行中的差异。
这是我在 BC4 中实现所需行为的方法。
BC 在打开文件进行比较时支持 运行 和 "pre-processor" 应用程序。 所以我所做的是制作一个简单的可执行文件,它带有 3 个参数 (argv[]):
- 原始文件的路径
- 处理后的文件路径(BC最终会打开对比)
- 包含以行分隔的搜索子字符串的 txt 文件的路径(更多内容见下文)
上面的项目编号 3 可以只包含一个条目(使用与原始问题相同的示例),例如 "transactionType: 6"。然后,可执行文件会在原始文件(上面的第 1 项)的每一行中搜索上面第 3 项中定义的搜索子字符串。每次命中时,整行都被复制(附加)到输出文件中(上面的第 2 项)。
接下来,您需要在 BC 中定义文件格式(在 Mac 上,您转到 Beyond Compare 菜单并单击 File Formats ...)。 Select 您文件的扩展名,然后单击 转换 选项卡。使用下面的屏幕截图作为示例。 注:%s是BC定义的指原文件(第1项)的路径,%t指的是处理文件的路径(第2项)。
因此,当您打开 File1.txt 和 File2.txt 为了进行比较,BC 将调用您的可执行文件(每个执行一次),然后打开生成的文件(第 2 项)。这将有效地显示两个文件的 "filtered" 版本,仅显示包含搜索子字符串的行。
另请注意,%t 参数将是 BC 内部生成的某种临时路径。
下面是上述可执行文件的快速实现:
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
int main(int argc, const char * argv[])
{
ifstream inputFile (argv[1]);
ifstream substringFile (argv[3]);
ofstream outputFile;
outputFile.open(argv[2]);
//build the list of substrings from the substring input file
list<string> substringList;
string line;
//TODO: make this safer
while (getline(substringFile, line))
{
substringList.push_back(line);
}
//for each substring in the list
for (list<string>::const_iterator iter = substringList.begin(); iter != substringList.end(); iter++)
{
if (inputFile.is_open())
{
//for all the lines in the file
while (getline(inputFile, line))
{
//Find the current substring
if (line.find(*iter) != string::npos)
{
outputFile << line << "\n";
}
}
}
//go back to the beginning of the file
inputFile.clear();
inputFile.seekg(0, ios::beg);
}
inputFile.close();
outputFile.close();
return 0;
}
希望对您有所帮助!