You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何筛选不含前置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

火山引擎 最新活动