如何用Bash处理含超长行与特殊符号的文本并提取指定字段
解决方案
用Python脚本处理(推荐)
由于文本包含大量特殊符号,awk/sed的正则处理容易因转义问题出错,Python的正则模块能更可靠地应对这类复杂场景。
以下是实现脚本:
import re # 读取原文件内容 with open("input.txt", "r", encoding="utf-8") as f: content = f.read() # 匹配keyword2的内容:EN开头+14位数字 keyword2_pattern = re.compile(r'"keyword2":"(EN\d{14})"') # 匹配keyword6的内容:拆分前缀和后续文本,直到"keyword7"前结束 keyword6_pattern = re.compile(r'"keyword6":"((\d{2}-\d{2}-\d{2}-\d{3}-\d{3}-A\w*) - (.*?))(?=","keyword7")', re.DOTALL) # 提取所有匹配项 keyword2_matches = keyword2_pattern.findall(content) keyword6_matches = keyword6_pattern.findall(content) # 生成输出内容,按分号分隔三列 output_lines = [] # 一一对应每组keyword2和keyword6,输出多行结果 for k2, (_, k6_prefix, k6_text) in zip(keyword2_matches, keyword6_matches): output_lines.append(f"{k2};{k6_prefix};{k6_text}") # 写入新文件 with open("output.txt", "w", encoding="utf-8") as f: f.write("\n".join(output_lines))
脚本说明:
re.DOTALL参数让正则中的.可以匹配换行符,兼容超长行场景- 用
(?=","keyword7")正向预查精准定位keyword6内容的结束位置,避免特殊符号导致匹配溢出 - 支持多组keyword2和keyword6的提取,自动一一对应输出
替代方案:命令行工具组合(适合快速处理)
如果偏好命令行操作,可通过grep提取关键片段,再用awk拆分:
# 提取目标片段并格式化输出 grep -o '"keyword2":"EN\{1\}\d\{14\}"\|"keyword6":"\d\{2\}-\d\{2\}-\d\{2\}-\d\{3\}-\d\{3\}-A\w* - .*?"' input.txt | \ awk -F'"' ' /keyword2/ {k2=$4} /keyword6/ { split($4, parts, " - ") print k2 ";" parts[1] ";" parts[2] } ' > output.txt
注意:此方案要求keyword2出现在对应keyword6之前,且文本中无嵌套双引号干扰。
内容的提问来源于stack exchange,提问作者HangInThere
相关产品推荐
相关产品推荐

