gawk提取文件文本片段异常:空值与冗余内容排查及修复
问题分析与解决方案
问题原因拆解
1. a[1]和b[1]为空的根源
原代码中匹配a、b行的正则表达式强制要求行结尾为</a>,但实际HTML行的结尾是</a><br>,导致正则完全匹配失败,match函数无法捕获目标文本,因此a[1]、b[1]始终为空。
2. 冗余内容出现的原因
处理包含<div class='start'>的行时,代码先提取标记后的文本123赋值给t并设置flag=1,随后又进入flag==1的分支,将整行内容追加到t中,导致t重复包含了<b>d:</b> "ef"<br><br><div class='start'>123这部分冗余内容,后续行继续追加后,冗余部分被保留到最终输出。
修改后的gawk代码
gawk 'BEGIN { flag = 0; t = ""; } { # 匹配a行,移除行结尾限制,只捕获<a>标签内的文本 if ($0 ~ /^<b>a:<\/b> <a class=\x27a\x27/) { match($0, /<b>a:<\/b> <a class=\x27a\x27 href=\x27\/a\/[0-9]+\x27>(.*)<\/a>/, a) } # 匹配b行,同理调整正则 if ($0 ~ /^<b>b:<\/b> <a class=\x27b\x27/) { match($0, /<b>b:<\/b> <a class=\x27b\x27 href=\x27\/b\/[0-9]+\x27>(.*)<\/a>/, b) } # 处理start标记行,提取内容后跳过当前行的后续追加逻辑 if ($0 ~ /<div class=\x27start\x27>/) { match($0, /^.*<div class=\x27start\x27>(.*)$/, s); t = s[1]; flag = 1; next; } if (flag == 1) { if ($0 ~ /^<br><br><b>end<\/b>/) { str = a[1] ";" b[1] ";" t; print(str) > "output.txt"; flag = 0; str = ""; t = ""; } else { # 追加当前行内容 t = t " " $0; } } }' input.txt
修改说明
- 调整匹配正则:移除对行结尾的限制,确保即使行尾有
<br>也能精准捕获<a>标签内的文本,解决a[1]、b[1]为空的问题。 - 添加
next语句:处理<div class='start'>行时,提取目标文本后直接跳过当前行的后续处理,避免将整行内容重复追加到t,消除冗余内容。 - 保持语法兼容:继续使用
\x27转义单引号,确保在gawk 4.0.1环境下正常运行。
内容的提问来源于stack exchange,提问作者lyrically wicked
相关产品推荐
相关产品推荐

