如何按规则从多行文本文件提取多字符串?(附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
相关产品推荐
相关产品推荐

