如何筛选不含前置y()函数的new o开头代码行
如何筛选包含"new o"的行但排除紧跟在"y("函数行上方的行?
需求说明
你需要从文本文件中提取所有包含new o的行,但要排除掉那些刚好在以y(开头的行的上一行的new o行。举个例子:
示例输入
new o85 = x(-1.3); y(o85, 12.0, 91.2, 5); y(o85, 12.0, 91.2, 6); y(o85, 12.0, 91.2, 7); new o86 = x(-1.3); new o87 = x(-1.3); y(o87, 12.0, 91.2, 9); new o88 = x(-1.3); new o89 = x(-1.3); new o90 = x(-1.3); y(o90, 12.0, 91.2, 3); new o91 = x(-1.3); new o92 = x(-1.3); new o93 = x(-1.3); new o94 = x(-1.3); new o95 = x(-1.3); new o96 = x(-1.3); y(o96, 12.0, 91.2, 3); new o97 = x(-1.3); new o98 = x(-1.3); new o99 = x(-1.3);
期望输出
new o86 = x(-1.3); new o88 = x(-1.3); new o89 = x(-1.3); new o91 = x(-1.3); new o92 = x(-1.3); new o93 = x(-1.3); new o94 = x(-1.3); new o95 = x(-1.3); new o97 = x(-1.3); new o98 = x(-1.3); new o99 = x(-1.3);
解决方案
这里提供两种实用的方法,分别适合命令行快速处理和编程场景:
方法1:使用awk命令(推荐,命令行快速处理)
awk是处理文本行的绝佳工具,我们可以利用它的行缓存特性来实现需求:
awk ' /^y\(/ { prev_new_o = 0; print; next } /new o/ { if (prev_new_o != 0) print prev_new_o; prev_new_o = $0; next } { if (prev_new_o != 0) print prev_new_o; prev_new_o = 0; print } END { if (prev_new_o != 0) print prev_new_o } ' your_file.txt
逻辑解释:
- 用
prev_new_o变量缓存上一行的new o内容 - 当遇到以
y(开头的行时:标记不需要输出缓存的new o行,直接打印当前行并跳过后续逻辑 - 当遇到
new o行时:如果之前有缓存的new o行(说明它后面没有紧跟y(),先输出缓存的行,然后把当前行存入缓存 - 遇到其他行时:如果有缓存的
new o行,先输出它,清空缓存后打印当前行 - 最后在
END块处理文件末尾可能剩下的缓存new o行
方法2:使用Python脚本(适合编程扩展)
如果你需要在Python环境中处理,可以用以下脚本:
def filter_lines(file_path): filtered = [] prev_line = None with open(file_path, 'r') as f: for line in f: line = line.rstrip('\n') if line.startswith('y('): # 如果上一行是new o,从结果中移除 if prev_line and 'new o' in prev_line: if prev_line in filtered: filtered.remove(prev_line) filtered.append(line) prev_line = line continue if 'new o' in line: filtered.append(line) prev_line = line continue # 其他行正常加入结果 filtered.append(line) prev_line = line # 最后再校验一次,确保所有紧跟y(的new o行都被排除 final_result = [] for idx, line in enumerate(filtered): if 'new o' in line: # 检查下一行是否是y(开头,且不是最后一行 if idx + 1 < len(filtered) and filtered[idx+1].startswith('y('): continue final_result.append(line) return final_result # 使用示例 for line in filter_lines('your_file.txt'): print(line)
逻辑解释:
- 遍历每一行,用
prev_line记录上一行内容 - 当遇到
y(开头的行时,检查上一行是否是new o行,如果是则从结果列表中移除它 - 其他情况下,
new o行直接加入结果列表 - 最后再遍历一次结果,确保所有紧跟在
y(行上方的new o行都被排除
内容的提问来源于stack exchange,提问作者yoranus




