You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按规则从多行文本文件提取多字符串?(附Awk尝试代码)

从代码文本中提取指定字符串的需求与Awk实现尝试

需求说明

  • 从多行文本文件中提取目标字符串,搜索关键字为"String server"、" pac "和"String method"
  • 这些关键字在{}包裹的代码块内可能出现0次或1次
  • 匹配后提取双引号""内的值,并去除值中的()符号
  • "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;
}

预期输出

AAA retrieveA
BBB retrieveB
CCC 
retrieveD
EEE retrieveE

尝试的GNU Awk 5.0.1实现代码

awk '{
if ($0 ~ /String method/ || ($0 ~ /String server/) ) 
{
str=$0; 
sub("String", "", str);
sub(")", "", str);
sub("=", "", str);
gsub(/\(/, "", str);
gsub(/"/, "", str);
gsub(/;/, "", str);
if (str ~ /method/) 
{
    method = str; 
    gsub(/[[:blank:]]/, "", method); 
    gsub(/method/, "", method); 
    arr[i][1] = method
    count++
} else if (str ~ /server/) 
{
    server = str; 
    gsub(/[[:blank:]]/, "", server); 
    gsub(/server/, "", server); 
    arr[i][0] = server
    count++
}
}
if (count > 1 || $0 ~ /log./) {
    count = 0
    i++
}
}
END {
for (i in arr) {
    printf "%s %s\n", arr[i][0], arr[i][1];
}
}' in

内容的提问来源于stack exchange,提问作者albertkao9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:42:57