如何使用这些规则从多行文本文件中提取多个字符串?搜索字符串为“String server”、“pac”和“String method”。它们在封闭的“{}”中可能只出现一次,也可能不出现一次。如果搜索字符串“String server”的值未包含在“”内,则忽略其值。搜索字符串匹配后,提取“”内不含“()”的值。搜索字符串“ pac ”的值优先于搜索字符串“String server”的值。搜索字符串“String server”或“pac”的值仅出现一次 - 不重复。它的值将出现在搜索字符串“String method”的值之前。例如示例文本文件位于:
{{{{{
public AResponse retrieveA(ARequest req){
String server = "AAA";
String method = "retrieveA()";
log.info(method,
server,
req);
return res;
}
public BResponse retrieveB(BRequest req){
String method = "retrieveB()";
BBB pac = new BBB();
log.info(method,
pac,
req);
return res;
}
public CResponse retrieveC(CRequest req) {
String server = "CCC";
log.info(server,
req);
return res;
}
public DResponse retrieveD(DRequest req) {
String method = "retrieveD()";
log.info(method,req);
return res;
}
public EResponse retrieveE(ERequest req){
EEE pac = new EEE();
String method = "retrieveE()";
String server = "EEE";
log.info(method,
server,
pac,
req);
return res;
}
public FResponse callretrieveF(FRequest req) throws InvalidDataException {
String server = "FFFFF";
//retrieveF
String method = "retrieveF()";
try {
log.info(method,
server,
req);
FFFFF pac = new FFFFF();
}
}
/**
* callgetG
* getG
*/
public GResponse callgetG(GRequest req) throws InvalidDataException {
//getG
String method = "getG()";
String server = "GGGGGG";
try {
try {
GGGGGG pac = new GGGGGG();
log.info(method,
server,
req);
}
}
}
/**
* getH
*/
public HResponse getH(HRequest req)
throws InvalidDataException {
//getH
String method = "getH()";
String server = "HHHHHHH";
String calledMethod = "getH2()";
ARequest aReq = new ARequest(req.getH(),
req.getR());
ProgramAccountInformationResponse resp = null;
try {
log.info(LogMessages.msgInfoMethodStartPrivate(method,
server,
calledMethod,
req));
return resp;
}catch(InvalidDataException ide){
log.error(method);
throw ide;
}
}
public IResponse determineI(IRequest req){
String method = "determineI()";
}
private IResponse callI(IRequest req){
String method = "callI()";
IIIII pac = new IIIII();
String server = pac.getName();
}
}}}}}
预期输出:
AAA retrieveA
BBB retrieveB
CCC
retrieveD
EEE retrieveE
FFFFF retrieveF
GGGGGG getG
HHHHHHH getH
determineI
IIIII callI
从多行文本文件中提取多个字符串 - 较大的测试文件 无法正确获取最后 2 个输出的解决方案 :确定I IIIIII callI
您可以使用这个重构的 awk 脚本来处理此数据。请注意,我们需要检查块标记的开头是否有两个
private
或两个关键字。此外,需要像和那样public
的检查以避免覆盖两个数组的相同数组索引。!col1[n]
!col2[n]
然后将此脚本称为:
TXR中的解决方案,几乎精确匹配所需的输出格式。在答案的末尾,显示了精确匹配格式的尝试:
不完全清楚的是为什么
EEE retrieveE
要在没有列填充的情况下打印。是不是组的第一项不参与列计算的规则?或者该组的第一项是否有助于列计算,但只是不以这种方式打印?或者这只是规范中的错误?代码:
我不喜欢访问的不一致,即:在调用中
partition-by
,我们使用op
带有 lambda 参数@1
,@2
和@3
;引用元组的语法。在 的计算中maxlen
,我们使用访问器first
和来引用元组third
;我们的输出块使用模式匹配为它们提供名称server
,meth
和pac
(如代码的先前迭代中一样)。这是关于我们应该考虑使用结构的复杂程度。
首先介绍一个
tuple
带槽的结构server
,meth
并且pac
:现在我们可以看到, 是通过最大化或字符串
maxlen
的长度在一个组上计算的,优先级是; 因为当有两列时,该数据将是第一列。server
pac
server
在之前的答案中,我们将打印放在 TXR 内部
@(repeat)
,在提取数据时打印数据。现在我们有了一个@(collect)
支撑一切的东西,所以我们可以对其进行另一次传递,以便将其分组到调整了第一列的子组中。打印逻辑与之前相同,只是当仅
meth
出现 a 时,我们将其打印为缩进四个空格。精确匹配输出
我们引入了一种技巧,即任何第一列为三列或更少的多列项目都以四列宽度打印。因此,对齐仅适用于具有较长项目的行:
跑步:
现在,该
EEE
行已打印为窄栏。请注意,输出格式几乎看起来好像要求只是对齐到四个空格制表位;但这
IIIII callI
条线并不遵循这一点;不在callI
四个空格制表位上。